在Coq中将证明从Z转移到N

时间:2019-02-18 17:36:36

标签: coq coq-tactic formal-verification

Coq中是否可以用一种半自动的方式证明整数语句和转移语句?

举一个具体的例子,请遵循以下引理:

Lemma cancellation:
  forall a b c: nat, a > 0 -> a * b = a * c -> b = c.

该语句实际上在Z中是正确的。在这种情况下,更容易证明,因为可以使用减法来获得a * (b - c) = 0,然后简化a。但是自然减法是有上限的,因此这是行不通的。

假设我可以用整数证明这一点。有没有一种策略可以用来推导自然法则?

1 个答案:

答案 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.