在 Coq 中将证明从 Z 转移到 N
Transfering proof from Z to N in Coq
在 Coq in 中有没有办法以半自动的方式证明整数语句和自然数的转移语句?
举个具体的例子,取下面的引理:
Lemma cancellation:
forall a b c: nat, a > 0 -> a * b = a * c -> b = c.
这个命题在Z中其实是成立的。这种情况下更容易证明,因为可以用减法得到a * (b - c) = 0
,然后化简a
。但是自然数的减法是有上限的,因此这是行不通的。
假设我可以用整数证明这一点。是否有一些策略可以用来推导出自然数的陈述?
一种解决方案是一种名为 zify
的策略,它会自动将操纵自然数的目标转变为操纵整数的目标(例如,通过插入对 Z.of_nat
的适当调用)。此策略由 lia
内部调用,但似乎没有很好的记录。至少提到了here.
在您的情况下,这将给出以下结果。
Require Import ZArith.
(* The lemma stated in Z. *)
Lemma cancellation:
(forall a b c, a > 0 -> a * b = a * c -> b = c)%Z.
Proof.
(* your favorite proof of this result *)
Admitted.
(* The lemma stated in nat. *)
Lemma cancellation_nat:
forall a b c: nat, a > 0 -> a * b = a * c -> b = c.
Proof.
intros.
zify.
eauto using cancellation.
Qed.
在 Coq in 中有没有办法以半自动的方式证明整数语句和自然数的转移语句?
举个具体的例子,取下面的引理:
Lemma cancellation:
forall a b c: nat, a > 0 -> a * b = a * c -> b = c.
这个命题在Z中其实是成立的。这种情况下更容易证明,因为可以用减法得到a * (b - c) = 0
,然后化简a
。但是自然数的减法是有上限的,因此这是行不通的。
假设我可以用整数证明这一点。是否有一些策略可以用来推导出自然数的陈述?
一种解决方案是一种名为 zify
的策略,它会自动将操纵自然数的目标转变为操纵整数的目标(例如,通过插入对 Z.of_nat
的适当调用)。此策略由 lia
内部调用,但似乎没有很好的记录。至少提到了here.
在您的情况下,这将给出以下结果。
Require Import ZArith.
(* The lemma stated in Z. *)
Lemma cancellation:
(forall a b c, a > 0 -> a * b = a * c -> b = c)%Z.
Proof.
(* your favorite proof of this result *)
Admitted.
(* The lemma stated in nat. *)
Lemma cancellation_nat:
forall a b c: nat, a > 0 -> a * b = a * c -> b = c.
Proof.
intros.
zify.
eauto using cancellation.
Qed.