如何通过一次迭代展开Coq定点

时间:2018-12-30 06:54:02

标签: coq

我的证明环境中有以下内容:

1 subgoal
a, b : nat
H : (fix loop (m : nat) : nat :=
       match (m - a) with
       | 0 => m
       | S m' => loop m'
       end) b = 0
G : (b - a) = 0

很明显,H等于

       match (b - a) with
       | 0 => b
       | S m' => loop m'
       end = 0

然后允许我使用G重写。

但是由于它被困在其中,表示为(m-a),因此我无法使用G进行重写。

如何通过一次迭代展开定点?

编辑:以下代码将设置证明环境。只是忽略admit语句。您的目标不是证明语句(琐碎的事),而是“展开”定点。

From mathcomp Require Import all.

Goal forall a b : nat,
  modn b a = 0 -> True.
Proof.
  intros a b H.
  unfold modn in H.
  destruct a.
    + admit.
    + simpl in H.
      assert ((b - a) = 0) as G.
      - admit.
      - unfold modn_rec in H.

1 个答案:

答案 0 :(得分:4)

要展开定点,您需要破坏其递减参数。

destruct b; simpl in H.

如果要保留单个案例,则必须在单独的引理或assert ion中证明您提到的相等性。

assert (Hfix : (fix loop m := match ... end) b = match ... end)