在Coq中将nat转换为Q.

时间:2015-09-22 10:04:09

标签: coq

如何在Coq中将nat转换为Q(Rational)?

我希望能够写出这样的内容:

Require Import Coq.QArith.QArith.
Open Scope Q_scope.

Definition a := 2/3.

当我尝试这样做时,Coq告诉我:

Error: The term "2" has type "nat" while it is expected to have type "Q".

1 个答案:

答案 0 :(得分:3)

你可以这样写:

Definition a := Z.of_nat 2 # Pos.of_nat 3.

#运算符只是Qmake类型的Q构造函数的表示法。该构造函数将Zpositive的元素作为参数,因此您需要强制转换才能将nat放入其中。

如果您使用文字数字语法,也可以直接使用Zpositive

Definition a := 2 # 3.

不同之处在于此定义未提及nat的转换;数字已经是正确的类型,因为Coq直接将数字符号解释为Zpositive

我个人不喜欢标准的Coq有理数字库,因为它使用等价而不是Leibniz相等;也就是说,Q 1 # 12 # 2的元素等同于有理数,但根据Coq的等式不相等:

Goal (1 # 1 <> 2 # 2).
congruence.
Qed.

有一个名为 setoid rewrite 的功能,可以让你假装它们是平等的。它的工作原理是只允许你重写函数,你已证明它与Q上的等价概念兼容。但是,仍然存在比莱布尼茨平等更难使用的情况。

您还可以尝试Ssreflect and MathComp软件包的rat库(请参阅文档here)。它有一个与莱布尼茨平等有效的理性定义,它比Coq更全面。