重写适用于整数,但不适用于Coq aac_策略的有理数

重写适用于整数,但不适用于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_战术库需要表示结合性、交换性等的定理。让我们看

我在测试Coq重写策略模结合性和交换性(
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.