在Coq中修改、使用和应用let表达式

在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

我不知道如何在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 (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