Coq 逻辑:所有的定义和所有的定理
任务如下: 从[In]中汲取灵感,编写递归函数[All] 说明某些属性[P]包含列表[l]的所有元素。到 确保你的定义是正确的,证明下面的[All_In]引理。 (当然,你的定义不应该只是重申左手的意思 [All_In]的侧面) 中的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'
定义如下:
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