如何将重写应用于条件的右侧而不分裂?

时间:2016-11-16 14:56:17

标签: coq

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,反之亦然。

1 个答案:

答案 0 :(得分:2)

几点说明:

  • 首先,你的证明太长了。多想一想,特别是看看你是否可能在错误的地方做太多导入或分裂。

  • 其次,这些重写有点难,但其中一些可能是“Setoids”和iff。您可能对or_iff_compat_l引理感兴趣:

    or_iff_compat_l : forall A B C : Prop, B <-> C -> A \/ B <-> A \/ C
    
  • 事实上,有些图书馆更喜欢使用/\\/的布尔版本来改善重写。

  • 最后,如果你破坏HL,你的目标就会被立即证明。