如何在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".
答案 0 :(得分:3)
你可以这样写:
Definition a := Z.of_nat 2 # Pos.of_nat 3.
#
运算符只是Qmake
类型的Q
构造函数的表示法。该构造函数将Z
和positive
的元素作为参数,因此您需要强制转换才能将nat
放入其中。
如果您使用文字数字语法,也可以直接使用Z
和positive
:
Definition a := 2 # 3.
不同之处在于此定义未提及nat
的转换;数字已经是正确的类型,因为Coq直接将数字符号解释为Z
和positive
。
我个人不喜欢标准的Coq有理数字库,因为它使用等价而不是Leibniz相等;也就是说,Q
1 # 1
和2 # 2
的元素等同于有理数,但根据Coq的等式不相等:
Goal (1 # 1 <> 2 # 2).
congruence.
Qed.
有一个名为 setoid rewrite 的功能,可以让你假装它们是平等的。它的工作原理是只允许你重写函数,你已证明它与Q
上的等价概念兼容。但是,仍然存在比莱布尼茨平等更难使用的情况。
您还可以尝试Ssreflect and MathComp软件包的rat
库(请参阅文档here)。它有一个与莱布尼茨平等有效的理性定义,它比Coq更全面。