【发布时间】:2018-06-24 23:58:32
【问题描述】:
我在围绕 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.
【问题讨论】: