Lemma in_app_iff : forall A l l' (a:A),
In a (l++l') <-> In a l \/ In a l'.
Proof.
intros.
split.
- induction l.
+ simpl.
induction l'.
* simpl. intros. inversion H.
* simpl.
intros [HL | HR].
right. left. apply HL.
right. right. apply HR.
+ simpl.
intros [HL | HR].
* left. left. apply HL.
* apply or_assoc.
right.
apply IHl.
apply HR.
- intros [HL | HR].
+ induction l.
* inversion HL.
* simpl in HL.
simpl.
A : Type
x : A
l, l' : list A
a : A
HL : x = a \/ In a l
IHl : In a l -> In a (l ++ l')
============================
x = a \/ In a (l ++ l')
我在想,如果我能以某种方式仅在右侧应用IHl
,那么我可以申请HL
来解决此案,但我不确定如何。
如果我在这里使用split,那么我将失去解决这个问题的能力,因为我必须在假设的x = a
分支中证明In a l
,反之亦然。
答案 0 :(得分:2)
几点说明:
首先,你的证明太长了。多想一想,特别是看看你是否可能在错误的地方做太多导入或分裂。
其次,这些重写有点难,但其中一些可能是“Setoids”和iff。您可能对or_iff_compat_l
引理感兴趣:
or_iff_compat_l : forall A B C : Prop, B <-> C -> A \/ B <-> A \/ C
事实上,有些图书馆更喜欢使用/\
和\/
的布尔版本来改善重写。
最后,如果你破坏HL
,你的目标就会被立即证明。