Coq中是否可以用一种半自动的方式证明整数语句和转移语句?
举一个具体的例子,请遵循以下引理:
Lemma cancellation:
forall a b c: nat, a > 0 -> a * b = a * c -> b = c.
该语句实际上在Z中是正确的。在这种情况下,更容易证明,因为可以使用减法来获得a * (b - c) = 0
,然后简化a
。但是自然减法是有上限的,因此这是行不通的。
假设我可以用整数证明这一点。有没有一种策略可以用来推导自然法则?
答案 0 :(得分:4)
一种解决方案是称为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.