gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:26:03 25 4
gpt4 key购买 nike

我在 state 周围做一些 coq 证明时卡住了。单子(monad)。具体来说,我已经将情况简化为这个证明:

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.

最佳答案

一旦你回想起来,就很容易看出你接下来需要做什么

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.

关于coq - 处理当前目标中的 let-in 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48278491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com