重写适用于整数,但不适用于Coq aac_策略的有理数
我在测试Coq重写策略模结合性和交换性(重写适用于整数,但不适用于Coq aac_策略的有理数,coq,coq-tactic,coq-plugin,Coq,Coq Tactic,Coq Plugin,我在测试Coq重写策略模结合性和交换性(aac_策略)。以下示例适用于整数(Z),但当整数替换为有理数(Q)时会生成错误 将Require Import ZArith.替换为Require Import QArith.等时,出现错误: 错误:策略失败:找不到匹配的模数AC 在aac\u重写H. Z和Q之间存在类似的不一致问题,这与Z/Q范围是否打开有关 但我不明白为什么aac重写在这里不起作用。不一致的原因是什么?如何使其在Z和Q中表现相同?AAC_战术库需要表示结合性、交换性等的定理。让我们看
aac_策略
)。以下示例适用于整数(Z
),但当整数替换为有理数(Q
)时会生成错误
将Require Import ZArith.
替换为Require Import QArith.
等时,出现错误:
错误:策略失败:找不到匹配的模数AC
在aac\u重写H.
Z
和Q
之间存在类似的不一致问题,这与Z
/Q
范围是否打开有关
但我不明白为什么aac重写在这里不起作用。不一致的原因是什么?如何使其在
Z
和Q
中表现相同?AAC_战术库需要表示结合性、交换性等的定理。让我们看一下表示有理数的结合定律的Qplus_assoc
Qplus_assoc
: forall x y z : Q, x + (y + z) == x + y + z
如您所见,Qplus\u assoc
没有使用=
,而是使用=
来表示左侧和右侧之间的连接。有理数在标准库中定义为整数和正数对:
Record Q : Set := Qmake {Qnum : Z; Qden : positive}.
因为,例如1/2=2/4,我们需要一些其他的方法来比较等式的有理数(除了=
这是eq
的符号)。因此,stdlib定义了Qeq
:
Definition Qeq (p q : Q) := (Qnum p * QDen q)%Z = (Qnum q * QDen p)%Z.
带符号
Infix "==" := Qeq (at level 70, no associativity) : Q_scope.
因此,对于有理数,您可能希望将示例改写为以下内容:
Require Import Coq.QArith.QArith.
Require Import AAC_tactics.AAC.
Require AAC_tactics.Instances.
Import AAC_tactics.Instances.Q.
Open Scope Q_scope.
Goal (forall x, x + (-x) == 0) ->
forall a b c, a + b + c + (-(c+a)) == b.
intros H ? ? ?.
aac_rewrite H.
Search (0 + ?x == ?x).
apply Qplus_0_l.
Qed.
Require Import Coq.QArith.QArith.
Require Import AAC_tactics.AAC.
Require AAC_tactics.Instances.
Import AAC_tactics.Instances.Q.
Open Scope Q_scope.
Goal (forall x, x + (-x) == 0) ->
forall a b c, a + b + c + (-(c+a)) == b.
intros H ? ? ?.
aac_rewrite H.
Search (0 + ?x == ?x).
apply Qplus_0_l.
Qed.