Coq 如何消除表达式内部的析取?

Coq 如何消除表达式内部的析取?,coq,Coq,既然证明存在x0:A,fx0=y/\(x=x0\/在x0l中)与证明存在x0:A,fx0=y/\在x0l中是一样的,我想在这里消除x=x0,这样我就可以应用归纳假设,但我不确定如何做到这一点。我尝试了留在(x=x0\/在x0l)和其他各种事情,但我没有成功地实现它。事实证明,为所有a b c,(a/\c)->a/\(b\/c)定义类型的帮助函数来进行重写对于存在式下的术语也不起作用 这怎么可能呢 请注意,以上是SF book练习之一。事实证明,有必要定义帮助者 1 subgoal A : Typ

既然证明
存在x0:A,fx0=y/\(x=x0\/在x0l中)
与证明
存在x0:A,fx0=y/\在x0l中
是一样的,我想在这里消除
x=x0
,这样我就可以应用归纳假设,但我不确定如何做到这一点。我尝试了
留在(x=x0\/在x0l)
和其他各种事情,但我没有成功地实现它。事实证明,为所有a b c,(a/\c)->a/\(b\/c)定义
类型的帮助函数来进行重写对于存在式下的术语也不起作用

这怎么可能呢


请注意,以上是SF book练习之一。

事实证明,有必要定义帮助者

1 subgoal
A : Type
B : Type
x : A
l : list A
IHl : forall (f : A -> B) (y : B),
      In y (map f l) -> exists x : A, f x = y /\ In x l
f : A -> B
y : B
H : In y (map f l)
______________________________________(1/1)
exists x0 : A, f x0 = y /\ (x = x0 \/ In x0 l)

这会立即进行所需的重写。我犯了一个愚蠢的错误,认为我需要一个策略而不是一个辅助引理。我应该更仔细地研究前面的例子——如果我这样做了,我就会意识到存在论需要得到解释。

你可以通过以下任何一种方法来获得归纳假设的组成部分:

  • 专门化(IHl f y h);销毁国际人道主义法
  • destruct(IHl f y H)
  • edestruct IHl

然后,您可以使用
exists
split
将目标转换为更易于操作的形式。

我恳请您不要分享SF练习的解决方案,因为它们在课堂上使用。严格地说,这并不“相同”,这是隐含的。
1 subgoal
A : Type
B : Type
x : A
l : list A
IHl : forall (f : A -> B) (y : B),
      In y (map f l) -> exists x : A, f x = y /\ In x l
f : A -> B
y : B
H : In y (map f l)
______________________________________(1/1)
exists x0 : A, f x0 = y /\ (x = x0 \/ In x0 l)
Lemma In_map_iff_helper : forall (X : Type) (a b c : X -> Prop), 
  (exists q, (a q /\ c q)) -> (exists q, a q /\ (b q \/ c q)).
Proof.
intros.
destruct H.
exists x.
destruct H.
split.
apply H.
right.
apply H0.
Qed.