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)
的辅助函数来进行重写对于存在性条件下的术语也不起作用。
这怎么办?
请注意,以上是科幻书的练习之一。
答案 0 :(得分:1)
您可以使用以下任何一种方法来访问归纳假设的组成部分:
specialize (IHl f y h); destruct IHl
destruct (IHl f y H)
edestruct IHl
然后您可以使用exists
和split
将目标操纵成易于使用的形式。
答案 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.
这可以立即进行所需的重写。我犯了一个非常愚蠢的错误,以为我需要战术而不是辅助引理。我应该更仔细地研究前面的示例-如果这样做,我将意识到需要考虑存在性。