在Coq中修改、使用和应用let表达式
我不知道如何在coq中应用let表达式。这来自PF中的选择排序示例 一旦定义了选择函数,这个引理就被证明了在Coq中修改、使用和应用let表达式,coq,let,coq-tactic,Coq,Let,Coq Tactic,我不知道如何在coq中应用let表达式。这来自PF中的选择排序示例 一旦定义了选择函数,这个引理就被证明了 Lemma select_perm: forall x l, let (y,r) := select x l in Permutation (x::l) (y::r). 下面是一些用例,看看它是如何工作的 Compute select_perm 3 [10;32;4;6;5]. = select_perm 3 [10; 32; 4; 6; 5] : let
Lemma select_perm: forall x l,
let (y,r) := select x l in
Permutation (x::l) (y::r).
下面是一些用例,看看它是如何工作的
Compute select_perm 3 [10;32;4;6;5].
= select_perm 3 [10; 32; 4; 6; 5]
: let (y, r) := select 3 [10; 32; 4; 6; 5] in
Permutation [3; 10; 32; 4; 6; 5] (y :: r)
Compute select 3 [10; 32; 4; 6; 5].
= (3, [10; 32; 4; 6; 5])
: nat * list nat
我如何进一步评估它以暴露实际的排列-类似于Compute((选择perm 3[10;32;4;6;5])(选择3[10;32;4;6;5])
我不知道如何使用这个引理来应用下面的定理
Lemma selsort_perm:
forall n,
forall l, length l = n -> Permutation l (selsort l n).
Proof.
intros.
generalize dependent n.
induction l; intros.
- subst.
simpl.
constructor.
- subst. simpl.
destruct (select a l) eqn:?.
有了相应的目标,我想以某种方式应用select\u perm(apply(select\u perm a l)
)
或者,相应地,通过传递性断言(置换(a::l)(n::l0))
进行证明,并以某种方式将以下Heqp带到具有新目标的let表达式中。
有没有一种简单的方法可以像coq中的函数应用一样处理let表达式
编辑:
我通过将select\u perm
修改为select\u perm'
Lemma select_perm': forall x l,
Permutation (x::l) ((fst (select x l)) :: (snd (select x l))).
归纳列表的长度,而不是列表本身(如果需要,可以提供代码),但更愿意使用Appel的原始定义…是的,这是一个棘手的问题。这是我提议的结构。为了制作一个可行的自我示例,我只假设存在函数
select
和selsort
以及关系Permutation
实际上,我在我的目标中介绍了我希望使用的定理的实例(如你所建议的),然后我可以用Heqp
重写。最后两行是事情实际发生的地方
Require Import List.
Section playground.
Variable select : nat -> list nat -> nat * list nat.
Variable Permutation : list nat -> list nat -> Prop.
Lemma select_perm: forall x l,
let (y,r) := select x l in
Permutation (x::l) (y::r).
Proof.
Admitted.
Variable selsort : list nat -> nat -> list nat.
Lemma goal_at_hand (a : nat) (l : list nat)
(IHl : forall n : nat, length l = n -> Permutation l (selsort l n))
(n : nat) (l0 : list nat) (Heqp : select a l = (n, l0)):
Permutation (a :: l) (n :: selsort l0 (length l)).
Proof.
generalize (select_perm a l).
rewrite Heqp.
让这个问题变得棘手的是Coq使用了let…:=。。。在…
语法中,但这实际上是一个模式匹配表达式:您需要表达式显式地是对
构造函数的应用程序,以便让
表达式以更简单的形式转换自身
您获得的目标具有以下形状,我想您需要一个引理,说明置换
是可传递的
Permutation (a :: l) (n :: l0) ->
Permutation (a :: l) (n :: selsort l0 (length l))
是的,这是一件棘手的事情。这是我提议的结构。为了制作一个可行的自我示例,我只假设存在函数
select
和selsort
以及关系Permutation
实际上,我在我的目标中介绍了我希望使用的定理的实例(如你所建议的),然后我可以用Heqp
重写。最后两行是事情实际发生的地方
Require Import List.
Section playground.
Variable select : nat -> list nat -> nat * list nat.
Variable Permutation : list nat -> list nat -> Prop.
Lemma select_perm: forall x l,
let (y,r) := select x l in
Permutation (x::l) (y::r).
Proof.
Admitted.
Variable selsort : list nat -> nat -> list nat.
Lemma goal_at_hand (a : nat) (l : list nat)
(IHl : forall n : nat, length l = n -> Permutation l (selsort l n))
(n : nat) (l0 : list nat) (Heqp : select a l = (n, l0)):
Permutation (a :: l) (n :: selsort l0 (length l)).
Proof.
generalize (select_perm a l).
rewrite Heqp.
让这个问题变得棘手的是Coq使用了let…:=。。。在…
语法中,但这实际上是一个模式匹配表达式:您需要表达式显式地是对
构造函数的应用程序,以便让
表达式以更简单的形式转换自身
您获得的目标具有以下形状,我想您需要一个引理,说明置换
是可传递的
Permutation (a :: l) (n :: l0) ->
Permutation (a :: l) (n :: selsort l0 (length l))
在你解构
之前,将你的引理专门化
(或断言
,或提出证明
)为一个假设。请对那些想帮助你的人友善一些,发布一个独立的问题。在这种情况下,我们不知道什么是PF,什么是select
,什么是Permutation
专门化
(或者断言
,或者提出证明
)在你解构
之前,你的引理变成了一个假设。请对那些想帮助你的人友善一点,发布一个自足的问题。在这种情况下,我们不知道什么是PF,什么是select
,什么是Permutation
。