Coq变量存在于列表中
我无法证明列表中的存在变量。我怎样才能证明这一点:Coq变量存在于列表中,coq,formal-verification,Coq,Formal Verification,我无法证明列表中的存在变量。我怎样才能证明这一点: Lemma exists_in_list_helper: forall (X : Type) (a : X) (P : X -> Prop), (exists b : X, In b [a] -> P b) -> P a. Proof. Admitted. 我还有一个问题。如何对列表中的值进行案例分析(如果列表的这一部分中是否存在)?这是我要证明的主要引理。感谢您的帮助: Lemma in_l
Lemma exists_in_list_helper: forall (X : Type) (a : X) (P : X -> Prop),
(exists b : X, In b [a] -> P b) ->
P a.
Proof.
Admitted.
我还有一个问题。如何对列表中的值进行案例分析(如果列表的这一部分中是否存在)?这是我要证明的主要引理。感谢您的帮助:
Lemma in_list: forall (X : Type) (a : X) l (P : X -> Prop),
(a :: l <> [] /\ exists b : X, In b (a :: l) -> P b) ->
(P a /\ l = []) \/
(P a /\ l <> [] /\ exists b : X, In b l -> P b) \/
(P a /\ l <> [] /\ forall b : X, In b l -> ~ P b) \/
(~ P a /\ l <> [] /\ exists b : X, In b l -> P b).
Proof.
列表中的引理:forall(X:Type)(a:X)l(P:X->Prop),
(a::l[]/\exists b:X,在b(a::l)->pb)->
(P a/\l=[])\/
(P a/\l[]/\exists b:X,在b l->P b中)\/
(P a/\l[]/\n对于所有b:X,在b l->~P b中)\/
(~pa/\l[]/\exists b:X,在bl->pb中)。
证明。
谢谢,对于第一个问题,我想说你可能还需要一个事实,
X
上的等式是可判定的:要么a=b
你可以替换,要么ab
你得到一个矛盾,但你需要能够进行这样的案例分析
对于第二个,您可以删除
a::l[]
部分,它总是正确的,不会给您任何东西。我很确定你也需要可判定等式(出于同样的原因)。你的第一个引理似乎不太可能:我们知道存在一个b
,使得pb
在[a]中保持iffb\。然而,我们不知道[a]
中的b\n是否成立,因此似乎很难证明。您可以将您的声明视为:
Lemma exists_in_list_helper (X : Type) (a : X) (P : X -> Prop) :
(exists b : X, a = b -> P b) ->
P a.
然后,它不会立即跟随a=b
。您可能需要一个引理,例如:
Lemma in1 T (x y : T) : In x [y] <-> x = y.
Proof.
split; intros H.
+ now apply in_inv in H; case H.
+ now rewrite H; constructor.
Qed.
但这需要对x
类型的等式的可判定性,参见_dec
中的引理。如果在l1、l2
中拆分列表l
,则其结果如下:
x \in l1 ++ l2 <-> x \in l1 \/ x \in l2
其中{x&px}
是类型
版本的exists x,px
谢谢您的友好回答。我还有一个问题。使用apply时出现“不可能统一”错误。我知道我们可以使用“模式”战术,但我不能正确地使用它。我已经证明了以下几点:~(exists b:X,In b l->P b)->(forall b:X,In b l->~P b)。我使用了模式(forall b:X,In b l->~P b),它产生了一个“乐趣”,但再次无法使用应用我的引理将forall替换为~exists。。。你能帮助我如何正确地使用模式来指导应用策略吗?@saeedM我认为这值得再问一个问题,我不知道你想做什么。请注意,您尝试进行的替换通常不适用于构造性逻辑。
x \in l1 ++ l2 <-> x \in l1 \/ x \in l2
x \in l -> { l1, l2 & l = l1 ++ [x] ++ l2 }