Coq 逻辑:所有的定义和所有的定理

Coq 逻辑:所有的定义和所有的定理,coq,logical-foundations,Coq,Logical Foundations,任务如下: 从[In]中汲取灵感,编写递归函数[All] 说明某些属性[P]包含列表[l]的所有元素。到 确保你的定义是正确的,证明下面的[All_In]引理。 (当然,你的定义不应该只是重申左手的意思 [All_In]的侧面) 中的定义如下: Fixpoint In {A : Type} (x : A) (l : list A) : Prop := match l with | [] => False | x' :: l' => x' = x \/ In x l'

任务如下:

从[In]中汲取灵感,编写递归函数[All] 说明某些属性[P]包含列表[l]的所有元素。到 确保你的定义是正确的,证明下面的[All_In]引理。 (当然,你的定义不应该只是重申左手的意思 [All_In]的侧面)

中的
定义如下:

Fixpoint In {A : Type} (x : A) (l : list A) : Prop :=
  match l with
  | [] => False
  | x' :: l' => x' = x \/ In x l'
  end.
首先,我以类似的方式定义了
All

Fixpoint All {T : Type} (P : T -> Prop) (l : list T) : Prop :=
  match l with
  | [] => False
  | x' :: l' => P x' /\ All P l'
  end.
但后来我认为这是不正确的,因为连接结束时的False总是会给出False

如果列表的最后一个nil元素不是空的,我们需要忽略它(这不起作用,只是一个想法):

错误,我不知道如何解决:

错误:术语“l'=[]”的类型“Prop”不是 (共)感应型

然后我回到第一种情况:

  | x' :: l' => P x' /\ All P l'
并尝试证明定理中的所有_:

Lemma All_In :
  forall T (P : T -> Prop) (l : list T),
    (forall x, In x l -> P x) <->
    All P l.
Proof.
  intros T P l. split.
  - (* Left to right *)
    intros H. induction l as [| h t IHl].
    + simpl. simpl in H.
因为我们的结论是错误的,但是前提中没有错误的假设,整个陈述都是谎言

  • 如何正确定义所有
  • 我的证据怎么了

  • 所有
    应将
    []
    转换为
    。这基本上是因为,但是你可以看到不这样做是如何导致问题的


    没有
    所有p[]
    都为真也会使引理为假。对于所有
    x
    ,x[]
    中的
    为false。但是false意味着任何东西,包括
    px
    ,所以我们对所有x都有
    ,在x[]->px
    。但是如果
    All P[]
    为false,那么这两个语句就不能等价。

    All
    应该将
    []
    转换为
    True
    。这基本上是因为,但是你可以看到不这样做是如何导致问题的

    没有
    所有p[]
    都为真也会使引理为假。对于所有
    x
    ,x[]
    中的
    为false。但是false意味着任何东西,包括
    px
    ,所以我们对所有x都有
    ,在x[]->px
    。但是如果
    All P[]
    为false,那么这两个语句就不可能是等价的

    Lemma All_In :
      forall T (P : T -> Prop) (l : list T),
        (forall x, In x l -> P x) <->
        All P l.
    Proof.
      intros T P l. split.
      - (* Left to right *)
        intros H. induction l as [| h t IHl].
        + simpl. simpl in H.
    
    T : Type
    P : T -> Prop
    H : forall x : T, False -> P x
    ============================
    False