coq中的自然数表

coq中的自然数表,coq,Coq,我有一个自然数列表,列表中的元素按降序排列。我想写一个关于列表的引理,第一个元素h大于列表中的所有元素。让列表为[h;h1;t]。0 h1?请指导我,如何写h大于列表尾部的所有元素 你需要说 对于任何自然数,以及任何像h::t这样的列表,如果列表是递减的,如果数字在尾部,那么它比头部小 所以你可以用Coq语言写 Lemma head_is_max : forall n h t, desc (h::t) -> In n t -> h >= n. Lemma head_is_ma

我有一个自然数列表,列表中的元素按降序排列。我想写一个关于列表的引理,第一个元素h大于列表中的所有元素。让列表为[h;h1;t]。0 h1?请指导我,如何写h大于列表尾部的所有元素

你需要说

对于任何自然数,以及任何像h::t这样的列表,如果列表是递减的,如果数字在尾部,那么它比头部小

所以你可以用Coq语言写

Lemma head_is_max : forall n h t, desc (h::t) -> In n t -> h >= n.
Lemma head_is_max : forall n h t, desc (h::t) = true -> In n t -> h >= n.
如果desc是一个布尔谓词,您可以编写

Lemma head_is_max : forall n h t, desc (h::t) -> In n t -> h >= n.
Lemma head_is_max : forall n h t, desc (h::t) = true -> In n t -> h >= n.
对t进行归纳将有助于证明

以更复杂的方式,您可以在列表上使用断言列表的所有元素都具有特定属性的谓词,您可以将其定义为

Fixpoint All {T : Type} (P : T -> Prop) (l : list T) : Prop :=
  match l with
    | [] => True
    | h :: t => P h /\ All P t
  end.
所以所有的pl意味着px对l中的所有x都有效。现在我们可以把上面提到的引理写成

Lemma head_is_max : forall h t, desc (h::t) -> All (fun n => h >= n) t.
你需要说

对于任何自然数,以及任何像h::t这样的列表,如果列表是递减的,如果数字在尾部,那么它比头部小

所以你可以用Coq语言写

Lemma head_is_max : forall n h t, desc (h::t) -> In n t -> h >= n.
Lemma head_is_max : forall n h t, desc (h::t) = true -> In n t -> h >= n.
如果desc是一个布尔谓词,您可以编写

Lemma head_is_max : forall n h t, desc (h::t) -> In n t -> h >= n.
Lemma head_is_max : forall n h t, desc (h::t) = true -> In n t -> h >= n.
对t进行归纳将有助于证明

以更复杂的方式,您可以在列表上使用断言列表的所有元素都具有特定属性的谓词,您可以将其定义为

Fixpoint All {T : Type} (P : T -> Prop) (l : list T) : Prop :=
  match l with
    | [] => True
    | h :: t => P h /\ All P t
  end.
所以所有的pl意味着px对l中的所有x都有效。现在我们可以把上面提到的引理写成

Lemma head_is_max : forall h t, desc (h::t) -> All (fun n => h >= n) t.

要表示给定的自然数列表是按降序排列的,可以使用Coq列表模块中的现有函数

Require Import List Lia.

Definition desc (l : list nat) : Prop :=
  forall i j, i <= j -> nth j l 0 <= nth i l 0.
s2_desc的证明是一种蛮力证明,它实际上尝试所有小于4的秩对,并进行检查 在所有这些情况下,自然数等级或列表中的值之间的比较确实给出了逻辑上可证明的公式

s1_n_desc的证明用于检查我对desc的定义是否真的拒绝了明显不满足标准的列表。这是一件好事,我写了这个证明,因为它帮助我发现了我的desc代码中的一个bug,这个bug没有被前面的证明所捕获:我写的是nth 0l I,而不是nth 1l 0

最后,但并非最不重要的一点是,我的解决方案从requireimportlist开始。这意味着我们使用两个现有的Coq模块。第一个提供了关于列表的常用函数,第二个提供了一个自动工具,可以对数字、自然数或整数之间的比较进行简单的证明

作为下一步,我们还可以编写一个布尔函数,在输入为空时精确计算值true
降序排列,并开发测试证明,以验证两个函数的行为是否一致。

要表示给定的自然数列表是降序排列的,可以使用Coq列表模块中的现有函数

Require Import List Lia.

Definition desc (l : list nat) : Prop :=
  forall i j, i <= j -> nth j l 0 <= nth i l 0.
s2_desc的证明是一种蛮力证明,它实际上尝试所有小于4的秩对,并进行检查 在所有这些情况下,自然数等级或列表中的值之间的比较确实给出了逻辑上可证明的公式

s1_n_desc的证明用于检查我对desc的定义是否真的拒绝了明显不满足标准的列表。这是一件好事,我写了这个证明,因为它帮助我发现了我的desc代码中的一个bug,这个bug没有被前面的证明所捕获:我写的是nth 0l I,而不是nth 1l 0

最后,但并非最不重要的一点是,我的解决方案从requireimportlist开始。这意味着我们使用两个现有的Coq模块。第一个提供了关于列表的常用函数,第二个提供了一个自动工具,可以对数字、自然数或整数之间的比较进行简单的证明

作为下一步,我们还可以编写一个布尔函数,在输入为空时精确计算值true
降序并开发测试证明,以验证两个函数的行为是否相应。

您需要定义降序的含义,并在证明中使用降序。 @伊夫也许有最整洁的方法。这里有另一个定义 只是写下一个简单的归纳定义。如果尾部是递减的,并且第一个元素大于或等于第二个元素,则列表是递减的

归纳定义的一个好处是,你可以对它们进行归纳,在每一个证明案例中,只需很少的工作,就可以提供大量的信息

Require Import List.

Inductive descending : list nat -> Prop :=
  desc_nil : descending nil
| desc_1 n : descending (cons n nil)
| desc_hd n m l :
    m <= n ->
    descending (cons m l) ->
    descending (cons n (cons m l)).

Lemma head_gt l d:
  descending l -> forall m, In m l -> m <= hd d l.
Proof.
  induction 1; intros k H'.
  now exfalso; apply in_nil in H'.
  now replace k with n; [ | inversion H'].
  now inversion H';
    [ subst; apply le_n
    | eapply PeanoNat.Nat.le_trans; auto].
Qed.

你需要定义你所说的降序是什么意思,并在你的证明中使用它。 @伊夫也许有最整洁的方法。这里有另一个定义 只是写下一个简单的归纳定义。如果尾部是递减的,并且第一个元素大于或等于第二个元素,则列表是递减的

归纳定义的一个好处是,你可以对它们进行归纳,在每一个证明案例中,只需很少的工作,就可以提供大量的信息

Require Import List.

Inductive descending : list nat -> Prop :=
  desc_nil : descending nil
| desc_1 n : descending (cons n nil)
| desc_hd n m l :
    m <= n ->
    descending (cons m l) ->
    descending (cons n (cons m l)).

Lemma head_gt l d:
  descending l -> forall m, In m l -> m <= hd d l.
Proof.
  induction 1; intros k H'.
  now exfalso; apply in_nil in H'.
  now replace k with n; [ | inversion H'].
  now inversion H';
    [ subst; apply le_n
    | eapply PeanoNat.Nat.le_trans; auto].
Qed.
谢谢你
a:nat l:list中的help.Fixpoint nat:Prop:=将l与m端中的| nil=>False | b::m=>b=a\/匹配。定义描述:=列表nat。引理head是max:forall n h t,desc h::t->In n t->h>=n。错误消息是非法的应用程序非功能性构造:Set类型的表达式desc无法应用于术语h::t:list?ALemma head_is_max:forall h n:natl:list nat,在nh::l->h>=n中。正在工作。@laibanaz By desc我指的是用来断言列表正在下降的谓词。如果您没有这样的谓词,使用Fixpoint来定义一个应该不难。@laibanaz是的,引理可以定义,但不可证明,因为它是错误的,它表示任何列表都是递减的。谢谢帮助。a:nat l:list中的Fixpoint nat:Prop:=在m end中将l与| nil=>False | b::m=>b=a\/匹配。定义描述:=列表nat。引理head是max:forall n h t,desc h::t->In n t->h>=n。错误消息是非法的应用程序非功能性构造:Set类型的表达式desc无法应用于术语h::t:list?ALemma head_is_max:forall h n:natl:list nat,在nh::l->h>=n中。正在工作。@laibanaz By desc我指的是用来断言列表正在下降的谓词。如果你没有这样一个谓词,用Fixpoint来定义它应该不难。@laibanaz是的,引理可以定义,但不可证明,因为它是错误的,它说任何列表都是递减的。