G4iSLt.G4iSLT_exch_prelims3

Require Import List.
Export ListNotations.
Require Import PeanoNat.
Require Import Lia.

Require Import general_export.

Require Import G4iSLT_calc.
Require Import G4iSLT_list_lems.
Require Import G4iSLT_exch_prelims1.

Lemma AtomImpL2_app_list_exchL : s se ps,
  (@list_exch_L s se)
  (AtomImpL2Rule [ps] s)
   ( pse, (@list_exch_L ps pse) *
    ((AtomImpL2Rule [pse] se) + (AtomImpL1Rule [pse] se))).
Proof.
intros s se ps exch RA. inversion RA. subst. inversion exch. subst. symmetry in .
apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
- destruct Γ4.
  + simpl in . subst. simpl. destruct Γ5.
      * simpl in . simpl. destruct Γ6.
        { simpl in . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). split ;auto. apply list_exch_L_id. }
        { simpl in . inversion . subst. simpl. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - exists (Γ0 A :: Γ6 # P :: Γ2, C). repeat split. apply list_exch_L_id. auto.
          - exists (Γ0 A :: (Γ6 ) # P :: Γ2, C). repeat split. repeat rewrite app_assoc. apply list_exch_L_id. left.
            pose (AtomImpL2Rule_I P A C Γ0 (Γ6 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct .
            * simpl in ; subst. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split. apply list_exch_L_id. auto.
            * inversion ; subst. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 # P :: Γ7, C). repeat split. apply list_exch_L_id. auto. }
      * simpl in . inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
        { destruct Γ6.
          - simpl in ; subst. simpl. exists (Γ0 A :: Γ5 # P :: Γ2, C) . repeat split ; auto. apply list_exch_L_id.
          - inversion ; subst. exists (Γ0 # P :: Γ6 A :: Γ5 Γ7, C) . split ; auto.
            pose (list_exch_LI Γ0 (A :: Γ5) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            right. pose (AtomImpL1Rule_I P A C Γ0 Γ6 (Γ5 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - exists ((Γ0 Γ6) A :: Γ5 # P :: Γ2, C). split. 2: left.
            pose (list_exch_LI Γ0 (A :: Γ5) [] Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ6) Γ5 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - exists ((Γ0 Γ6) A :: (Γ5 ) # P :: Γ2, C). split. 2: left.
            pose (list_exch_LI Γ0 (A :: Γ5) [] Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ6) (Γ5 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct .
            * simpl in ; subst. repeat rewrite app_assoc ; simpl. exists ((Γ0 ) A :: Γ5 # P :: Γ2, C). repeat split. 2: left.
              pose (list_exch_LI Γ0 (A :: Γ5) [] (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ0 ) Γ5 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion ; subst. repeat rewrite app_assoc ; simpl. exists ((Γ0 ) # P :: A :: Γ5 Γ7, C). repeat split. 2: right.
              pose (list_exch_LI Γ0 (A :: Γ5) [] ( # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C (Γ0 ) (Γ5 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { destruct .
          - simpl in . destruct Γ6.
            + simpl in ; subst. repeat rewrite app_assoc ; simpl. repeat rewrite app_assoc ; simpl.
                exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split. 2: left. apply list_exch_L_id. auto.
            + inversion . subst. repeat rewrite app_assoc ; simpl. rewrite app_nil_r. exists (Γ0 # P :: Γ6 A :: Γ1 Γ7, C). repeat split. 2: right ; apply AtomImpL1Rule_I.
               pose (list_exch_LI Γ0 (A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
          - inversion . subst. exists ((Γ0 Γ6) A :: Γ1 # P :: Γ7, C). repeat split. 2: left.
            pose (list_exch_LI Γ0 [] (A :: Γ1 # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ6) Γ1 ( Γ7)). repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
  + inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
     * destruct Γ5.
        { simpl in . destruct Γ6.
          - simpl in . subst. simpl. exists (Γ0 A :: Γ4 # P :: Γ2, C). repeat split. 2: left. apply list_exch_L_id. apply AtomImpL2Rule_I.
          - inversion . subst. simpl. exists (Γ0 # P :: Γ6 A :: Γ4 Γ7, C). repeat split. 2: right. 2: apply AtomImpL1Rule_I.
            pose (list_exch_LI Γ0 (A :: Γ4) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l. }
        { inversion . subst. simpl. exists (Γ0 Γ6 # P :: Γ5 A :: Γ4 Γ7, C). repeat split. 2: right.
          pose (list_exch_LI Γ0 (A :: Γ4) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
          pose (AtomImpL1Rule_I P A C (Γ0 Γ6) Γ5 (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
     * apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
       { destruct Γ6.
          - simpl in . subst. simpl. exists (Γ0 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ0 (A :: Γ4) [] Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ5) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - inversion . subst. simpl. exists (Γ0 # P :: Γ6 Γ5 A :: Γ4 Γ7, C). repeat split. 2: right.
            pose (list_exch_LI Γ0 (A :: Γ4) Γ5 (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL1Rule_I P A C Γ0 (Γ6 Γ5) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - exists (Γ0 Γ6 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ0 (A :: Γ4) Γ5 Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ6 Γ5) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - exists (Γ0 Γ6 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ0 (A :: Γ4) Γ5 Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ6 Γ5) (Γ4 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct .
            * simpl in . subst. repeat rewrite app_assoc. simpl. exists (Γ0 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
              pose (list_exch_LI Γ0 (A :: Γ4) Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ0 Γ5) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. repeat rewrite app_assoc. simpl. exists (Γ0 # P :: Γ5 A :: Γ4 Γ7, C). repeat split. 2: right.
              pose (list_exch_LI Γ0 (A :: Γ4) Γ5 ( # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C (Γ0 ) ( Γ5) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { destruct .
          - simpl in . subst. simpl. repeat rewrite app_assoc. simpl. destruct Γ6.
            + simpl in . subst. simpl. exists (Γ0 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
               pose (list_exch_LI Γ0 (A :: Γ4) [] (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C (Γ0 ) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            + inversion . subst. simpl. exists (Γ0 # P :: Γ6 A :: Γ4 Γ7, C). repeat split. 2: right.
               pose (list_exch_LI Γ0 (A :: Γ4) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL1Rule_I P A C Γ0 (Γ6 ) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 Γ6 # P :: A :: Γ4 Γ7, C). repeat split. 2: right.
            pose (list_exch_LI Γ0 (A :: Γ4) ( # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL1Rule_I P A C (Γ0 Γ6 ) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
     * destruct .
       { simpl in . destruct Γ5.
          - simpl in . destruct Γ6.
            + simpl in . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split. apply list_exch_L_id. auto.
            + inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 # P :: Γ6 A :: Γ1 Γ7, C). repeat split. 2: right.
               pose (list_exch_LI Γ0 (A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL1Rule_I P A C Γ0 Γ6 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 Γ6 # P :: Γ5 A :: Γ1 Γ7, C). repeat split. 2: right.
            pose (list_exch_LI Γ0 (A :: Γ1) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL1Rule_I P A C (Γ0 Γ6) Γ5 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 Γ6 Γ5 A :: Γ1 # P :: Γ7, C). repeat split. 2: left.
         pose (list_exch_LI Γ0 (A :: Γ1 # P :: ) Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
         pose (AtomImpL2Rule_I P A C (Γ0 Γ6 Γ5) Γ1 ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
- destruct x ; simpl in ; subst ; repeat rewrite app_assoc ; simpl.
  * destruct Γ4.
    + simpl in . subst. simpl. destruct Γ5.
        { simpl in . simpl. destruct Γ6.
          { simpl in . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). split ;auto. apply list_exch_L_id. }
          { simpl in . inversion . subst. simpl. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            - exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split ; auto. apply list_exch_L_id.
            - destruct x.
              * simpl in . subst. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat rewrite app_assoc. repeat split. apply list_exch_L_id. auto.
              * inversion . subst. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 # P :: x Γ7, C). repeat split ; auto. apply list_exch_L_id.
            - exists (Γ0 A :: Γ6 x # P :: Γ2, C). repeat split ; auto. repeat rewrite app_assoc; apply list_exch_L_id. repeat rewrite app_assoc in RA ; auto. } }
        { simpl in . inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          { destruct Γ6.
            - simpl in . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C) . repeat split ;auto. apply list_exch_L_id.
            - inversion . subst. simpl. exists (Γ0 # P :: Γ6 A :: Γ1 Γ7, C) . repeat split ;auto. 2: right.
              pose (list_exch_LI Γ0 (A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C Γ0 Γ6 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
          { destruct x.
            - simpl in . subst. destruct Γ6.
              * simpl in . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C) . repeat split ;auto. apply list_exch_L_id.
              * inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 # P :: Γ6 A :: Γ1 Γ7, C) . repeat split ;auto. 2: right.
                pose (list_exch_LI Γ0 (A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C Γ0 Γ6 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 Γ6 A :: Γ1 # P :: x Γ7, C). repeat split ;auto. 2: left.
              pose (list_exch_LI Γ0 [] (A :: Γ1 # P :: x) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ0 Γ6) Γ1 (x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
          { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            - subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 Γ6 A :: Γ5 # P :: Γ2, C). repeat split ;auto. 2: left.
              pose (list_exch_LI Γ0 [] (A :: Γ5) Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ0 Γ6) Γ5 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - simpl. repeat rewrite app_assoc. simpl. exists (Γ0 Γ6 A :: Γ5 # P :: Γ2, C). repeat split ;auto. 2: left.
              pose (list_exch_LI Γ0 [] (A :: Γ5) Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ0 Γ6) (Γ5 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - destruct .
              + simpl in . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 x A :: Γ5 # P :: Γ2, C). repeat split ;auto. 2: left.
                 pose (list_exch_LI Γ0 [] (A :: Γ5) x (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C (Γ0 x) Γ5 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ0 x # P :: A :: Γ5 Γ7, C). repeat split ;auto. 2: right.
                 pose (list_exch_LI Γ0 (A :: Γ5) [] (x # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL1Rule_I P A C (Γ0 x) (Γ5 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. } }
    + inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
      { destruct Γ5.
        - simpl in . destruct Γ6.
          + simpl in . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split ; auto. apply list_exch_L_id.
          + inversion . subst. simpl. exists (Γ0 # P :: Γ6 A :: Γ1 Γ7, C). repeat split. 2: right.
             pose (list_exch_LI Γ0 (A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
             pose (AtomImpL1Rule_I P A C Γ0 Γ6 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
        - inversion . subst. simpl. exists (Γ0 Γ6 # P :: Γ5 A :: Γ1 Γ7, C). repeat split. 2: right.
          pose (list_exch_LI Γ0 (A :: Γ1) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
          pose (AtomImpL1Rule_I P A C (Γ0 Γ6) Γ5 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
      { destruct x.
          - simpl in . destruct Γ5.
            + simpl in . destruct Γ6.
              * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split ; auto. apply list_exch_L_id.
              * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 # P :: Γ6 A :: Γ1 Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ0 (A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C Γ0 Γ6 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            + inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ6 # P :: Γ5 A :: Γ1 Γ7, C). repeat split. 2: right.
               pose (list_exch_LI Γ0 (A :: Γ1) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL1Rule_I P A C (Γ0 Γ6) Γ5 (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ6 Γ5 A :: Γ1 # P :: x Γ7, C). repeat split. 2: left.
            pose (list_exch_LI Γ0 (A :: Γ1 # P :: x) Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ0 Γ6 Γ5) Γ1 (x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
      { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
        - destruct Γ6.
          + simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
             pose (list_exch_LI Γ0 (A :: Γ4) [] Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
             pose (AtomImpL2Rule_I P A C (Γ0 Γ5) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          + inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 # P :: Γ6 Γ5 A :: Γ4 Γ7, C). repeat split. 2: right.
             pose (list_exch_LI Γ0 (A :: Γ4) Γ5 (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
             pose (AtomImpL1Rule_I P A C Γ0 (Γ6 Γ5) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
        - apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          + simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ6 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
             pose (list_exch_LI Γ0 (A :: Γ4) Γ5 Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
             pose (AtomImpL2Rule_I P A C (Γ0 Γ6 Γ5) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          + subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ6 Γ5 A :: Γ4 x # P :: Γ2, C). repeat split. 2: left.
             pose (list_exch_LI Γ0 (A :: Γ4) Γ5 Γ6 (x # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
             pose (AtomImpL2Rule_I P A C (Γ0 Γ6 Γ5) (Γ4 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          + destruct x.
            * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ5 A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
               pose (list_exch_LI Γ0 (A :: Γ4) Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C (Γ0 Γ5) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 # P :: x Γ5 A :: Γ4 Γ7, C). repeat split. 2: right.
               pose (list_exch_LI Γ0 (A :: Γ4) Γ5 ( # P :: x) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL1Rule_I P A C (Γ0 ) (x Γ5) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
        - destruct .
          + simpl in . destruct Γ6.
            * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 x A :: Γ4 # P :: Γ2, C). repeat split. 2: left.
              pose (list_exch_LI Γ0 (A :: Γ4) [] x (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ0 x) Γ4 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 # P :: Γ6 x A :: Γ4 Γ7, C). repeat split. 2: right.
              pose (list_exch_LI Γ0 (A :: Γ4) x (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C Γ0 (Γ6 x) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          + inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 Γ6 x # P :: A :: Γ4 Γ7, C). repeat split. 2: right.
              pose (list_exch_LI Γ0 (A :: Γ4) (x # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C (Γ0 Γ6 x) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
  * inversion ; subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
    + destruct Γ4.
       { simpl in . destruct Γ5.
          - simpl in . destruct Γ6.
            * simpl in . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat split ; auto. apply list_exch_L_id.
            * inversion . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ6 Γ7, C). repeat split ; auto. apply list_exch_L_id.
          - inversion . subst. simpl. exists (Γ0 A :: Γ1 Γ6 # P :: Γ5 Γ7, C). repeat split ; auto. 2: left.
            pose (list_exch_LI (Γ0 A :: Γ1) (# P :: Γ5) [] Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C Γ0 (Γ1 Γ6) (Γ5 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { inversion . subst. simpl. exists (Γ0 A :: Γ1 Γ6 Γ5 # P :: Γ4 Γ7, C). repeat split ; auto. 2: left.
         pose (list_exch_LI (Γ0 A :: Γ1) (# P :: Γ4) Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
         pose (AtomImpL2Rule_I P A C Γ0 (Γ1 Γ6 Γ5) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
    + destruct .
      { destruct Γ4.
       { simpl in . destruct Γ5.
          - simpl in . destruct Γ6.
            * simpl in . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ2, C). repeat rewrite app_assoc; repeat split ; auto. apply list_exch_L_id.
            * inversion . subst. simpl. exists (Γ0 A :: Γ1 # P :: Γ6 Γ7, C). repeat rewrite app_assoc ; repeat split ; auto. apply list_exch_L_id.
          - inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 Γ6 # P :: Γ5 Γ7, C). repeat split ; auto. 2: left.
            pose (list_exch_LI (Γ0 A :: Γ1) (# P :: Γ5) [] Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C Γ0 (Γ1 Γ6) (Γ5 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 Γ6 Γ5 # P :: Γ4 Γ7, C). repeat split ; auto. 2: left.
         pose (list_exch_LI (Γ0 A :: Γ1) (# P :: Γ4) Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
         pose (AtomImpL2Rule_I P A C Γ0 (Γ1 Γ6 Γ5) (Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. } }
      { inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: Γ1 # P :: Γ6 Γ5 Γ4 Γ7, C). repeat split ; auto. 2: left. 2: apply AtomImpL2Rule_I.
        pose (list_exch_LI (Γ0 A :: Γ1 # P :: ) Γ4 Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l. }
    + apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
       { destruct Γ5.
          - simpl in . destruct Γ6.
            * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ4 # P :: Γ2, C). repeat split ; auto. 2: left. apply list_exch_L_id.
              pose (AtomImpL2Rule_I P A C Γ0 (x Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x # P :: Γ6 Γ4 Γ7, C). repeat split ; auto. 2: left. 2: apply AtomImpL2Rule_I.
              pose (list_exch_LI (Γ0 A :: x) Γ4 [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
          - inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ6 # P :: Γ5 Γ4 Γ7, C). repeat split ; auto. 2: left.
            pose (list_exch_LI (Γ0 A :: x) Γ4 (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C Γ0 (x Γ6) (Γ5 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - destruct Γ6.
            * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ5 Γ4 # P :: Γ2, C). repeat split ; auto. 2: left.
              pose (list_exch_LI (Γ0 A :: x) Γ4 [] Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ0 (x Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x # P :: Γ6 Γ5 Γ4 Γ7, C). repeat split ; auto. 2: left. 2: apply AtomImpL2Rule_I.
              pose (list_exch_LI (Γ0 A :: x) Γ4 Γ5 (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
          - apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            * simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ6 Γ5 Γ4 # P :: Γ2, C). repeat split ; auto. 2: left.
              pose (list_exch_LI (Γ0 A :: x) Γ4 Γ5 Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ0 (x Γ6 Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ6 Γ5 Γ4 # P :: Γ2, C). repeat split ; auto. 2: left.
              pose (list_exch_LI (Γ0 A :: x) Γ4 Γ5 Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ0 (x Γ6 Γ5 Γ4 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * destruct .
              + simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists(Γ0 A :: x Γ5 Γ4 # P :: Γ2, C). repeat split ; auto. 2: left.
                 pose (list_exch_LI (Γ0 A :: x) Γ4 Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ0 (x Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x # P :: Γ5 Γ4 Γ7, C). repeat split ; auto. 2: left.
                 pose (list_exch_LI (Γ0 A :: x) Γ4 Γ5 ( # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ0 (x ) ( Γ5 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct .
            * simpl in . destruct Γ6.
              + simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ4 # P :: Γ2, C). repeat split ; auto. 2: left.
                 pose (list_exch_LI (Γ0 A :: x) Γ4 [] (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ0 (x Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x # P :: Γ6 Γ4 Γ7, C). repeat split ; auto. 2: left.
                 pose (list_exch_LI (Γ0 A :: x) Γ4 (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ0 x (Γ6 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ6 # P :: Γ4 Γ7, C). repeat split ; auto. 2: left.
              pose (list_exch_LI (Γ0 A :: x) Γ4 ( # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ0 (x Γ6 ) ( Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
       { destruct .
          - simpl in . destruct Γ5.
            * simpl in . destruct Γ6.
              + simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x # P :: Γ2, C). repeat split ; auto. 2: left. apply list_exch_L_id.
                 pose (AtomImpL2Rule_I P A C Γ0 (x ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x # P :: Γ6 Γ7, C). repeat split ; auto. 2: left.
                 pose (list_exch_LI (Γ0 A :: x) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ0 x (Γ6 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ6 # P :: Γ5 Γ7, C) . repeat split ; auto. 2: left.
              pose (list_exch_LI (Γ0 A :: x) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ0 (x Γ6) (Γ5 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ0 A :: x Γ6 Γ5 # P :: Γ7, C). repeat split ; auto. 2: left.
            pose (list_exch_LI (Γ0 A :: x) ( # P :: ) Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C Γ0 (x Γ6 Γ5 ) ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
- apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
  * destruct Γ5.
      + simpl in . simpl. destruct Γ6.
        { simpl in . subst. simpl. exists (Γ3 Γ4 A :: Γ1 # P :: Γ2, C). repeat rewrite app_assoc in RA. split ;auto. repeat rewrite app_assoc. apply list_exch_L_id. }
        { simpl in . inversion . subst. simpl. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - exists (Γ3 A :: (Γ1 Γ4) # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ3 Γ4 [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct x.
            + simpl in . subst. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 Γ4 # P :: Γ2, C). repeat rewrite app_assoc. repeat split. 2: left.
               pose (list_exch_LI Γ3 Γ4 [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            + inversion . subst. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 # P :: x Γ4 Γ7, C). repeat rewrite app_assoc. repeat split. 2: left.
               pose (list_exch_LI Γ3 Γ4 [] (A :: Γ1 # P :: x) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C Γ3 Γ1 (x Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - exists (Γ3 A :: Γ6 Γ4 x # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ3 Γ4 [] (A :: Γ6) (x # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C Γ3 (Γ6 Γ4 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
      + simpl in . inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
        { destruct Γ6.
            - simpl in . subst. simpl. exists (Γ3 A :: Γ1 Γ4 # P :: Γ2, C). repeat split. 2: left.
              pose (list_exch_LI Γ3 Γ4 [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - inversion . subst. simpl. exists (Γ3 # P :: Γ6 A :: Γ1 Γ4 Γ7, C). repeat split. 2: right.
              pose (list_exch_LI Γ3 Γ4 (A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C Γ3 Γ6 (Γ1 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { destruct x.
            - simpl in . destruct Γ6.
              * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 A :: Γ1 Γ4 # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 Γ4 [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 # P :: Γ6 A :: Γ1 Γ4 Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ3 Γ4 (A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C Γ3 Γ6 (Γ1 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 Γ6 A :: Γ1 # P :: x Γ4 Γ7, C). repeat split. 2: left.
              pose (list_exch_LI Γ3 Γ4 (A :: Γ1 # P :: x) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ3 Γ6) Γ1 (x Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - exists ((Γ3 Γ6) A :: (Γ5 Γ4) # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ3 Γ4 (A :: Γ5) Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ3 Γ6) (Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - exists ((Γ3 Γ6) A :: (Γ5 Γ4 ) # P :: Γ2, C). repeat split. 2: left.
            pose (list_exch_LI Γ3 Γ4 (A :: Γ5) Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
            pose (AtomImpL2Rule_I P A C (Γ3 Γ6) (Γ5 Γ4 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct .
              * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 x A :: Γ5 Γ4 # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 Γ4 (A :: Γ5) x (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 x) (Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion . subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 x # P :: A :: Γ5 Γ4 Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ3 Γ4 (A :: Γ5) (x # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C (Γ3 x) (Γ5 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
  * apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
      + simpl in . simpl. destruct Γ6.
        { simpl in . subst. simpl. exists (Γ3 Γ5 Γ4 A :: Γ1 # P :: Γ2, C). repeat split. 2: left.
           pose (list_exch_LI Γ3 Γ4 [] Γ5 (A :: Γ1 # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
           pose (AtomImpL2Rule_I P A C (Γ3 Γ5 Γ4) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
         { inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            - simpl. exists (Γ3 A :: Γ1 Γ5 Γ4 # P :: Γ2, C). repeat split. 2: left.
              pose (list_exch_LI Γ3 Γ4 Γ5 (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - destruct .
              * simpl in . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 Γ5 Γ4 # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 Γ4 Γ5 (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion . subst. simpl. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 # P :: Γ5 Γ4 Γ7, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 Γ4 Γ5 (A :: Γ1 # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C Γ3 Γ1 ( Γ5 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - simpl. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ6 Γ5 Γ4 # P :: Γ2, C). repeat split. 2: left.
              pose (list_exch_LI Γ3 Γ4 Γ5 (A :: Γ6) ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C Γ3 (Γ6 Γ5 Γ4 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
      + subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          { exists ((Γ3 Γ6 Γ5 Γ4) A :: Γ1 # P :: Γ2, C) . repeat split. 2: left. repeat rewrite app_assoc ; apply list_exch_LI.
            pose (AtomImpL2Rule_I P A C (Γ3 Γ6 Γ5 Γ4) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
          { exists ((Γ3 Γ6 Γ5 Γ4 ) A :: Γ1 # P :: Γ2, C). split. 2: left. repeat rewrite app_assoc ; apply list_exch_LI.
            pose (AtomImpL2Rule_I P A C (Γ3 Γ6 Γ5 Γ4 ) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
          { destruct ; simpl in ; inversion ; subst.
            - repeat rewrite app_assoc ; simpl. exists ((Γ3 x Γ5 Γ4) A :: Γ1 # P :: Γ2, C). repeat split. repeat rewrite app_assoc ; apply list_exch_LI.
              left. pose (AtomImpL2Rule_I P A C (Γ3 x Γ5 Γ4) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
              + exists((Γ3 x) A :: (Γ1 Γ5 Γ4) # P :: Γ2, C). repeat split. 2: left.
                 pose (list_exch_LI Γ3 Γ4 Γ5 (x A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C (Γ3 x) (Γ1 Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + destruct .
                 * simpl in ; subst. repeat rewrite app_assoc ; simpl. repeat rewrite app_assoc ; simpl.
                    exists (Γ3 x A :: Γ1 Γ5 Γ4 # P :: Γ2, C). repeat split. 2: left.
                    pose (list_exch_LI Γ3 Γ4 Γ5 (x A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                    pose (AtomImpL2Rule_I P A C (Γ3 x) (Γ1 Γ5 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
                 * inversion ; subst. repeat rewrite app_assoc ; simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 x A :: Γ1 # P :: Γ5 Γ4 Γ7, C). repeat split. 2: left.
                    pose (list_exch_LI Γ3 Γ4 Γ5 (x A :: Γ1 # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                    pose (AtomImpL2Rule_I P A C (Γ3 x) Γ1 ( Γ5 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + repeat rewrite app_assoc. simpl. exists (Γ3 x A :: Γ5 Γ4 # P :: Γ2, C). repeat split. 2: left.
                 pose (list_exch_LI Γ3 Γ4 Γ5 (x A :: ) ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C (Γ3 x) ( Γ5 Γ4 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
      + destruct x ; simpl in ; inversion ; subst.
          { destruct Γ6.
            - simpl in . subst. simpl in . simpl. repeat rewrite app_assoc. simpl. exists ((Γ3 Γ4) A :: Γ1 # P :: Γ2, C). split ;auto. 2: left.
              pose (list_exch_LI Γ3 Γ4 [] (A :: Γ1 # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ3 Γ4) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - simpl in . inversion . clear . subst. simpl. repeat rewrite app_assoc. simpl.
              apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
              + exists (Γ3 A :: (Γ1 Γ4) # P :: Γ2, C). repeat split. 2: left.
                 pose (list_exch_LI Γ3 Γ4 (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              + destruct x.
                 * simpl in ; subst. repeat rewrite app_assoc ; simpl. exists (Γ3 A :: Γ1 Γ4 # P :: Γ2, C). repeat split. 2: left.
                   pose (list_exch_LI Γ3 Γ4 (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL2Rule_I P A C Γ3 (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
                 * inversion . subst. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 # P :: x Γ4 Γ7, C). repeat split. 2: left. 2: apply AtomImpL2Rule_I.
                   pose (list_exch_LI Γ3 Γ4 (A :: Γ1 # P :: x) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              + exists (Γ3 A :: Γ6 Γ4 x # P :: Γ2, C). repeat split. 2: left.
                 pose (list_exch_LI Γ3 Γ4 (A :: Γ6) (x # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C Γ3 (Γ6 Γ4 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
          - destruct Γ6.
             * repeat rewrite app_assoc ; simpl. simpl in . subst. exists (Γ3 A :: Γ1 Γ4 # P :: Γ2, C). split ;auto. 2: left.
               pose (list_exch_LI Γ3 Γ4 [] ( A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C (Γ3 ) (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
             * repeat rewrite app_assoc ; simpl. inversion . subst. exists (Γ3 # P :: Γ6 A :: Γ1 Γ4 Γ7, C). split ;auto. 2: right.
               pose (list_exch_LI Γ3 Γ4 ( A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL1Rule_I P A C Γ3 (Γ6 ) (Γ1 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - destruct .
             * simpl in . destruct Γ6.
                + repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. simpl in . subst. exists (Γ3 A :: Γ1 Γ4 # P :: Γ2, C). split ;auto. 2: left.
                   pose (list_exch_LI Γ3 Γ4 [] ( A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL2Rule_I P A C (Γ3 ) (Γ1 Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
                + repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. inversion . subst. exists (Γ3 # P :: Γ6 A :: Γ1 Γ4 Γ7, C). split ;auto. 2: right.
                   pose (list_exch_LI Γ3 Γ4 ( A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL1Rule_I P A C Γ3 (Γ6 ) (Γ1 Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
             * repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. inversion . subst. exists (Γ3 Γ6 A :: Γ1 # P :: Γ4 Γ7, C). split ;auto. 2: left.
               pose (list_exch_LI Γ3 Γ4 ( A :: Γ1 # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C (Γ3 Γ6 ) Γ1 ( Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
          - apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            + repeat rewrite app_assoc ; simpl. exists (Γ3 Γ6 A :: x Γ4 # P :: Γ2, C). split ;auto. 2: left.
               pose (list_exch_LI Γ3 Γ4 ( A :: x) Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C (Γ3 Γ6 ) (x Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            + repeat rewrite app_assoc ; simpl. exists (Γ3 Γ6 A :: x Γ4 # P :: Γ2, C). split ;auto. 2: left.
               pose (list_exch_LI Γ3 Γ4 ( A :: x) Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
               pose (AtomImpL2Rule_I P A C (Γ3 Γ6 ) (x Γ4 ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            + destruct .
              * repeat rewrite app_assoc ; simpl. simpl in . subst. exists (Γ3 A :: x Γ4 # P :: Γ2, C). split ;auto. 2: left.
                 pose (list_exch_LI Γ3 Γ4 ( A :: x) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL2Rule_I P A C (Γ3 ) (x Γ4) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * repeat rewrite app_assoc ; simpl. inversion . subst. exists (Γ3 # P :: A :: x Γ4 Γ7, C). split ;auto. 2: right.
                 pose (list_exch_LI Γ3 Γ4 ( A :: x) ( # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL1Rule_I P A C (Γ3 ) ( ) (x Γ4 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
  * destruct ; simpl in ; inversion ; subst.
      + destruct Γ5 ; simpl in ; inversion ; subst.
          { destruct Γ6.
            - simpl in . subst. repeat rewrite app_assoc. simpl. exists ((Γ3 x) A :: Γ1 # P :: Γ2, C). repeat split. 2: left. repeat rewrite app_assoc. apply list_exch_L_id.
              pose (AtomImpL2Rule_I P A C (Γ3 x) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - simpl in . inversion . subst. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
              * repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 x # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 x [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C Γ3 (Γ1 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * destruct .
               + simpl in ; subst. repeat rewrite app_assoc. simpl. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 x # P :: Γ2, C). repeat split. 2: left.
                  pose (list_exch_LI Γ3 x [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL2Rule_I P A C Γ3 (Γ1 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
               + inversion ; subst. repeat rewrite app_assoc. simpl. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 # P :: x Γ7, C). repeat split. 2: left.
                  pose (list_exch_LI Γ3 x [] (A :: Γ1 # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL2Rule_I P A C Γ3 Γ1 ( x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * repeat rewrite app_assoc. simpl. repeat rewrite app_assoc. exists (Γ3 A :: (Γ6 x ) # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 x [] (A :: Γ6) ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C Γ3 (Γ6 x ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
          { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            - destruct Γ6.
              * simpl in ; subst. repeat rewrite app_assoc. simpl. exists (Γ3 A :: Γ1 x # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 x [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C Γ3 (Γ1 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion ; subst. repeat rewrite app_assoc. simpl. exists (Γ3 # P :: Γ6 A :: Γ1 x Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ3 x (A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C Γ3 Γ6 (Γ1 x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - destruct .
              * simpl in . destruct Γ6.
                + simpl in ; subst. repeat rewrite app_assoc. simpl. repeat rewrite app_assoc. simpl. exists (Γ3 A :: (Γ1 x) # P :: Γ2, C). repeat split. 2: left.
                   pose (list_exch_LI Γ3 x [] (A :: Γ1) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL2Rule_I P A C Γ3 (Γ1 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
                + inversion ; subst. repeat rewrite app_assoc. simpl. repeat rewrite app_assoc. simpl. exists (Γ3 # P :: Γ6 A :: Γ1 x Γ7, C). repeat split. 2: right.
                   pose (list_exch_LI Γ3 x (A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL1Rule_I P A C Γ3 Γ6 (Γ1 x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion . subst. repeat rewrite app_assoc. simpl. repeat rewrite app_assoc. simpl. exists ((Γ3 Γ6) A :: Γ1 # P :: x Γ7, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 x (A :: Γ1 # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 Γ6) Γ1 ( x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - repeat rewrite app_assoc. simpl. apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
              * exists ((Γ3 Γ6) A :: (Γ5 x) # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 x (A :: Γ5) Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 Γ6) (Γ5 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * exists ((Γ3 Γ6) A :: (Γ5 x ) # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 x (A :: Γ5) Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 Γ6) (Γ5 x ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * destruct .
                + simpl in . subst. repeat rewrite app_assoc. simpl. exists ((Γ3 ) A :: (Γ5 x) # P :: Γ2, C). repeat split. 2: left.
                   pose (list_exch_LI Γ3 x (A :: Γ5) (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL2Rule_I P A C (Γ3 ) (Γ5 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
                + inversion . subst. repeat rewrite app_assoc. simpl. exists ((Γ3 ) # P :: A :: Γ5 x Γ7, C). repeat split. 2: right.
                   pose (list_exch_LI Γ3 x (A :: Γ5) ( # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                   pose (AtomImpL1Rule_I P A C (Γ3 ) (Γ5 x Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
      + apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
        { destruct Γ5.
            - simpl in . destruct Γ6.
              * simpl in . subst. simpl. repeat rewrite app_assoc ; simpl. exists ((Γ3 x) A :: Γ1 # P :: Γ2, C). repeat split. 2: left.
                repeat rewrite app_assoc. apply list_exch_L_id.
                pose (AtomImpL2Rule_I P A C (Γ3 x) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion ; subst. simpl. repeat rewrite app_assoc ; simpl. exists (Γ3 # P :: (Γ6 x) A :: Γ1 Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ3 [] (x A :: Γ1) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C Γ3 (Γ6 x) (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - inversion ; subst. simpl. repeat rewrite app_assoc ; simpl. exists ((Γ3 Γ6) # P :: (Γ5 x) A :: Γ1 Γ7, C). repeat split. 2: right.
              pose (list_exch_LI Γ3 (x A :: Γ1) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL1Rule_I P A C (Γ3 Γ6) (Γ5 x) (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { destruct .
            - simpl in . destruct Γ5.
              + simpl in . destruct Γ6.
                { simpl in . subst. simpl. repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl.
                  exists ((Γ3 x) A :: Γ1 # P :: Γ2, C). repeat split. 2: left. repeat rewrite app_assoc. apply list_exch_L_id.
                  pose (AtomImpL2Rule_I P A C (Γ3 x) Γ1 Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
                { inversion ; subst. simpl. repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. exists (Γ3 # P :: (Γ6 x) A :: Γ1 Γ7, C). repeat split. 2: right.
                  pose (list_exch_LI Γ3 (x A :: Γ1) [] (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL1Rule_I P A C Γ3 (Γ6 x) (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
              + inversion ; subst. simpl. repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. exists ((Γ3 Γ6) # P :: (Γ5 x) A :: Γ1 Γ7, C). repeat split. 2: right.
                 pose (list_exch_LI Γ3 (x A :: Γ1) (# P :: Γ5) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                 pose (AtomImpL1Rule_I P A C (Γ3 Γ6) (Γ5 x) (Γ1 Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - inversion ; subst ; simpl. repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. exists ((Γ3 Γ6 Γ5 x) A :: Γ1 # P :: Γ7, C). repeat split. 2: left.
              pose (list_exch_LI Γ3 (x A :: Γ1 # P :: ) Γ5 Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
              pose (AtomImpL2Rule_I P A C (Γ3 Γ6 Γ5 x) Γ1 ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
        { apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
            - destruct Γ6.
              * simpl in ; subst. simpl ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. exists ((Γ3 Γ5 x) A :: # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 (x A :: ) [] Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 Γ5 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion ; subst. simpl. repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc ; simpl. exists (Γ3 # P :: (Γ6 Γ5 x) A :: Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ3 (x A :: ) Γ5 (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C Γ3 (Γ6 Γ5 x) ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - apply app2_find_hole in . destruct . repeat destruct s ; destruct p ; subst.
              * repeat rewrite app_assoc ; simpl. exists ((Γ3 Γ6 Γ5 x) A :: # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 (x A :: ) Γ5 Γ6 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 Γ6 Γ5 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * exists ((Γ3 Γ6 Γ5 x) A :: ( ) # P :: Γ2, C). repeat split. 2: left.
                pose (list_exch_LI Γ3 (x A :: ) Γ5 Γ6 ( # P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL2Rule_I P A C (Γ3 Γ6 Γ5 x) ( ) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * repeat rewrite app_assoc ; simpl. destruct .
                + simpl in . subst. simpl. exists ((Γ3 Γ5 x) A :: # P :: Γ2, C). repeat split. 2: left.
                  pose (list_exch_LI Γ3 (x A :: ) Γ5 (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL2Rule_I P A C (Γ3 Γ5 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
                + inversion ; subst. simpl. exists ((Γ3 ) # P :: ( Γ5 x) A :: Γ7, C). repeat split. 2: right.
                  pose (list_exch_LI Γ3 (x A :: ) Γ5 ( # P :: ) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL1Rule_I P A C (Γ3 ) ( Γ5 x) ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
            - destruct .
              * simpl in . destruct Γ6.
               + simpl in ; subst. simpl ; repeat rewrite app_assoc ; simpl. exists ((Γ3 x) A :: # P :: Γ2, C). repeat split. 2: left.
                  pose (list_exch_LI Γ3 (x A :: ) [] (# P :: Γ2) C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL2Rule_I P A C (Γ3 x) Γ2). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
               + inversion ; subst. simpl ; repeat rewrite app_assoc ; simpl. exists (Γ3 # P :: (Γ6 x) A :: Γ7, C). repeat split. 2: right.
                  pose (list_exch_LI Γ3 (x A :: ) (# P :: Γ6) Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                  pose (AtomImpL1Rule_I P A C Γ3 (Γ6 x) ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto.
              * inversion ; subst. simpl ; repeat rewrite app_assoc ; simpl. exists ((Γ3 Γ6 ) # P :: ( x) A :: Γ7, C). repeat split. 2: right.
                pose (list_exch_LI Γ3 (x A :: ) ( # P :: ) Γ6 Γ7 C) ; repeat rewrite app_assoc ; simpl ; repeat rewrite app_assoc in l ; simpl in l ; repeat rewrite app_assoc in l ; simpl in l ; apply l.
                pose (AtomImpL1Rule_I P A C (Γ3 Γ6 ) ( x) ( Γ7)). repeat rewrite app_assoc ; repeat rewrite app_assoc in a ; simpl in a ; auto. }
Qed.