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

时间:2019-04-29 09:53:23

标签: coq

Lemma In_map_iff :
  forall (A B : Type) (f : A -> B) (l : list A) (y : B),
    In y (map f l) <->
    exists x, f x = y /\ In x l.
Proof.
split.
- generalize dependent y.
  generalize dependent f.
  induction l.
  + intros. inversion H.
  + intros.
    simpl.
    simpl in H.
    destruct H.
    * exists x.
      split.
      apply H.
      left. reflexivity.
    * 

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)

由于证明exists x0 : A, f x0 = y /\ (x = x0 \/ In x0 l)与证明exists x0 : A, f x0 = y /\ In x0 l相同,因此我想在目标内部消除x = x0,以便可以应用归纳假设,但我不确定该怎么做这个。我已经尝试过left in (x = x0 \/ In x0 l)和其他各种方法,但未能成功实现。事实证明,定义类型forall a b c, (a /\ c) -> a /\ (b \/ c)的辅助函数来进行重写对于存在性条件下的术语也不起作用。

这怎么办?

请注意,以上是科幻书的练习之一。

2 个答案:

答案 0 :(得分:1)

您可以使用以下任何一种方法来访问归纳假设的组成部分:

  • specialize (IHl f y h); destruct IHl
  • destruct (IHl f y H)
  • edestruct IHl

然后您可以使用existssplit将目标操纵成易于使用的形式。

答案 1 :(得分:0)

事实证明,有必要定义一个助手。

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.

这可以立即进行所需的重写。我犯了一个非常愚蠢的错误,以为我需要战术而不是辅助引理。我应该更仔细地研究前面的示例-如果这样做,我将意识到需要考虑存在性。