如何在coq中使用匹配的大小写和变量等价

时间:2015-12-29 07:48:37

标签: coq

我正在尝试使用以下定理

Theorem nat_rect_1_2: forall (P:nat->Type), (P O -> P 1 
  -> (forall n:nat, P n -> P (S n) -> P (S (S n))) -> forall n:nat, P n ).
Print nat_rect.
exact (fun (P : nat -> Type) (f0 : P 0) (f1 : P 1)
  (ff : forall n : nat, P n -> P(S n) -> P (S(S n))) =>
  fix F (n : nat) : P n :=
    match n as n0 return (P n0) with
    | 0 => f0
    | S n' =>  match n' with
       | 0 => f1
       | S n'' => ff n'' (F n'') (F n')
       end
    end).
Qed.

问题是F n'具有类型(P n')并且在该位置,但它应该是P(S n'')。但显然,S n''与n'相同,因为我们处于这种情况,但Coq无法检测到这一点。我如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

我建议使用策略证明引理,你是否故意手工编写证明术语?

无论如何,我认为你需要帮助Coq使用"护航模式"所以它可以统一这两个术语。详细了解此技术here

使用战术编辑证明: 如果我没记错的话,有一个"技巧"这个证明。你无法通过induction直接证明这一点,因为归纳就是"一个"一步一步,你需要两个。诀窍是首先证明:

Theorem nat_rect_1_2_gen: forall (P:nat->Type), (P O -> P 1 -> 
  (forall n:nat, P n -> P (S n) -> P (S (S n))) -> forall n:nat, (P n) *(P (S n))).

通过n上的归纳,然后使用此结果来证明您的原始目标。证明将从以下开始:

intros P hP0 hP1 hPS. (* introducing basic assumptions *)
induction n as [ | h [hn hSn]]. (* induction on n *)

你应该能够弄清楚如何证明每个子目标。如果您需要更多帮助,我会提供更多详细信息。