处理当前目标中的let-in表达式

时间:2018-01-16 09:56:36

标签: coq let

我在围绕state monad做一些coq样张时遇到了困难。具体来说,我已经将这种情况简化为这个证据:

Definition my_call {A B C} (f : A -> B * C) (a : A) : B * C :=
  let (b, c) := f a in (b, c).

Lemma mycall_is_call : forall {A B C} (f : A -> B * C) (a : A), my_call f a = f a.
Proof.
  intros A B C f a.
  unfold my_call.
  (* stuck! *)
Abort.

调用unfold后产生的目标是(let (b, c) := f a in (b, c)) = f a。如果我没有错,那么平等的两面应该完全相同,但我不知道如何从这里展示它。有什么帮助吗?

-

作为旁注,我已经看到coq自动应用简化,当函数的结果中没有涉及产品类型时:

Definition my_call' {A B : Type} (f : A -> B) (a : A) : B :=
  let b := f a in b.

Lemma my_call_is_call' : forall A B (f : A -> B) (a : A), my_call' f a = f a.
Proof.
  intros A B f a.
  unfold my_call'.
  reflexivity.
Qed.

1 个答案:

答案 0 :(得分:3)

一旦你回想起

,很容易看到下一步你需要做什么
let (b, c) := f a in (b, c)

的语法糖
match f a with (b, c) => (b, c) end

这意味着你需要在f a上进行破坏以完成证明:

Lemma mycall_is_call {A B C} (f : A -> B * C) a :
  my_call f a = f a.
Proof.
  unfold my_call.
  now destruct (f a).
Qed.