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]中保持iff
b\。然而,我们不知道[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 }