Library JordanCurveTheorem.Jordan8


Require Export Jordan7.



Open Scope nat_scope.

Lemma nf_L0L1_IA: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
    expf m x' y'0
      expf (L m zero x y) x' y'0b
        ¬ expf (L m one x' y') x_1b y
    cA_1 m zero y y' x y'
  False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
assert (y'0b = y'0).
 unfold y'0b in |- ×.
   simpl in |- ×.
   elim (eq_dart_dec x y').
   tauto.
 elim (eq_dart_dec (cA_1 m zero y) y').
   tauto.
 fold y'0 in |- ×.
    tauto.
rewrite H7 in H2.
  assert (x_1b = cA_1 (L m one x' y') one x).
 fold x_1b in |- ×.
    tauto.
simpl in H8.
  fold x'1 in H8.
  elim (eq_dart_dec x'1 x).
 intro.
   set (y'_1 := cA_1 m one y') in |- ×.
   fold y'_1 in H8.
   assert (x_1b = y'_1).
  rewrite H8 in |- ×.
    elim (eq_dart_dec y' x).
   intro.
     symmetry in a0.
      tauto.
  elim (eq_dart_dec x'1 x).
    tauto.
   tauto.
 assert (x' = x_1).
  unfold x_1 in |- *; rewrite <- a in |- ×.
    unfold x'1 in |- ×.
    rewrite cA_1_cA in |- ×.
    tauto.
  unfold m1 in H; simpl in H; tauto.
  unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
 clear H8.
   rewrite H9 in H3.
   assert (betweenf m x_1 y'0 y).
  generalize (expf_L0_CNS m x y x' y'0).
    simpl in |- ×.
    fold x_1 in |- ×.
    fold y_0 in |- ×.
    set (y_0_1 := cA_1 m one y_0) in |- ×.
    set (x0 := cA m zero x) in |- ×.
    elim (expf_dec m x_1 y).
   intros.
     assert
      (expf (L m zero x y) x' y'0
       betweenf m x_1 x' y betweenf m x_1 y'0 y
       betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0 x0
       ¬ expf m x_1 x' expf m x' y'0).
    unfold m1 in H; simpl in H; unfold m2 in H6; simpl in H6;
     unfold prec_L in H6; tauto.
   clear H8.
     assert
      (betweenf m x_1 x' y betweenf m x_1 y'0 y
       betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0 x0
       ¬ expf m x_1 x' expf m x' y'0).
     tauto.
   clear H11.
     elim H8.
    clear H8.
       tauto.
   clear H8.
     intro.
     elim H8.
    clear H8.
      intro.
       absurd (betweenf m y_0_1 x' x0).
     rewrite H10 in |- ×.
       unfold betweenf in |- ×.
       unfold MF.between in |- ×.
       intro.
       elim H11.
      intros i Hi.
        elim Hi.
        intros j Hj.
        decompose [and] Hj.
        clear H11 Hi Hj.
        set (p := MF.Iter_upb m y_0_1) in |- ×.
        fold p in H16.
        assert (i 0).
       intro.
         rewrite H11 in H12.
         simpl in H12.
         generalize H12.
         unfold y_0_1 in |- ×.
         unfold x_1 in |- ×.
         unfold y_0 in |- ×.
         intro.
         assert (x = cA m one x_1).
        unfold x_1 in |- ×.
          rewrite cA_cA_1 in |- ×.
          tauto.
        unfold m1 in H; simpl in H; tauto.
        unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
       assert (cA m zero x = y).
        rewrite H17 in |- ×.
          unfold x_1 in |- ×.
          rewrite <- H15 in |- ×.
          rewrite cA_cA_1 in |- ×.
         rewrite cA_cA_1 in |- ×.
           tauto.
         unfold m1 in H; simpl in H; tauto.
         unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
        unfold m1 in H; simpl in H; tauto.
        generalize (exd_cA_1 m zero y).
          unfold m1 in H; simpl in H;
        unfold prec_L in H; tauto.
       unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
      assert (i p - 1).
       intro.
         assert (j = p - 1).
         omega.
       rewrite H17 in H14.
         rewrite <- MF.Iter_f_f_1 in H14.
        unfold p in H14.
          rewrite MF.Iter_upb_period in H14.
         simpl in H14.
           assert (MF.f_1 = cF_1).
           tauto.
         rewrite H18 in H14.
           unfold y_0_1 in H14.
           unfold cF_1 in H14.
           rewrite cA_cA_1 in H14.
          unfold y_0 in H14.
            rewrite cA_cA_1 in H14.
           symmetry in H14.
             unfold x0 in H14.
             unfold m1 in H; simpl in H; unfold prec_L in H.
              tauto.
          unfold m1 in H; simpl in H; unfold prec_L in H.
            unfold m1 in H; simpl in H; unfold prec_L in H.
             tauto.
          unfold m1 in H; simpl in H; unfold prec_L in H.
             tauto.
         unfold m1 in H; simpl in H; unfold prec_L in H.
            tauto.
         unfold m1 in H; simpl in H; unfold prec_L in H.
           unfold y_0 in |- ×.
           generalize (exd_cA_1 m zero y).
           generalize (exd_cA_1 m zero y).
            tauto.
        unfold m1 in H; simpl in H; unfold prec_L in H.
           tauto.
        unfold m1 in H; simpl in H; unfold prec_L in H.
          unfold y_0_1 in |- *; unfold y_0 in |- ×.
          fold (cF m y) in |- ×.
          generalize (exd_cF m y).
          unfold m1 in H; simpl in H; unfold prec_L in H.
           tauto.
       unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
       unfold y_0_1 in |- *; unfold y_0 in |- ×.
         fold (cF m y) in |- ×.
         generalize (exd_cF m y).
         unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
        omega.
      assert (i - 1 = j).
       apply (MF.unicity_mod_p m y_0_1 (i - 1) j).
        unfold m1 in H; simpl in H; unfold prec_L in H.
           tauto.
       unfold y_0_1 in |- *; unfold y_0 in |- ×.
         fold (cF m y) in |- ×.
         generalize (exd_cF m y).
         unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
       fold p in |- ×.
          omega.
       fold p in |- ×.
          omega.
       rewrite <- MF.Iter_f_f_1 in |- ×.
        simpl in |- ×.
          rewrite H14 in |- ×.
          rewrite H12 in |- ×.
          assert (MF.f_1 = cF_1).
          tauto.
        rewrite H17 in |- ×.
          unfold x_1 in |- ×.
          unfold cF_1 in |- ×.
          rewrite cA_cA_1 in |- ×.
         fold x0 in |- ×.
            tauto.
        unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
        unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
       unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
       unfold y_0_1 in |- *; unfold y_0 in |- ×.
         fold (cF m y) in |- ×.
         generalize (exd_cF m y).
         unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
        omega.
       omega.
     unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
     unfold y_0_1 in |- *; unfold y_0 in |- ×.
       fold (cF m y) in |- ×.
       generalize (exd_cF m y).
       unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
     tauto.
   clear H8.
     intro.
      absurd (expf m x_1 x').
     tauto.
   rewrite H10 in |- ×.
     apply expf_refl.
    unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   rewrite <- H10 in |- ×.
     unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
   tauto.
 assert (inv_hmap (L m one x' y')).
  unfold m2 in H6.
    simpl in H6.
    simpl in |- ×.
     tauto.
 assert (exd m y'_1).
  unfold y'_1 in |- ×.
    generalize (exd_cA_1 m one y').
    unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
 generalize (expf_L1_CNS m x' y' y'_1 y H11 H12).
   simpl in |- ×.
   fold y'0 in |- ×.
   fold x'1 in |- ×.
   fold y'_1 in |- ×.
   elim (expf_dec m x' y'0).
  intro.
    intro.
    elim H3.
    rewrite a in H13.
    set (x0 := cA m zero x) in |- ×.
    fold x0 in H13.
    assert (betweenf m y'_1 y x0).
   clear H3.
     unfold betweenf in H8.
     unfold MF.between in H8.
     elim H8.
    intros i Hi.
      elim Hi.
      intros j Hj.
      decompose [and] Hj.
      clear Hi Hj H13.
      set (p := MF.Iter_upb m x_1) in |- ×.
      clear H8.
      assert (i j).
     intro.
       rewrite H8 in H3.
       assert (y'0 = y).
      rewrite <- H3 in |- ×.
         tauto.
     elim H4.
       rewrite <- H13 in |- ×.
       unfold y'0 in |- ×.
       rewrite cA_1_cA in |- ×.
       tauto.
     unfold m1 in H; simpl in H; tauto.
     unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
    rename H8 into Dij.
      unfold betweenf in |- ×.
      unfold MF.between in |- ×.
      intros.
      split with (j - i - 1).
      split with (p - 1 - i - 1).
      assert (p = MF.Iter_upb m y'_1).
     unfold p in |- ×.
       assert (expf m x_1 y'_1).
      rewrite <- H10 in |- ×.
        apply expf_trans with y'0.
        tauto.
      unfold expf in |- ×.
        split.
        tauto.
      unfold MF.expo in |- ×.
        split.
       unfold y'0 in |- ×.
         generalize (exd_cA m zero y').
         unfold m2 in H6; simpl in H6;
      unfold prec_L in H6; tauto.
      split with 1.
        simpl in |- ×.
        assert (MF.f = cF).
        tauto.
      rewrite H16 in |- ×.
        unfold cF in |- ×.
        unfold y'0 in |- ×.
        rewrite cA_1_cA in |- ×.
       fold y'_1 in |- ×.
          tauto.
       tauto.
      unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
     apply MF.period_expo.
       tauto.
     unfold expf in H16.
        tauto.
    rewrite <- H16 in |- ×.
      split.
     assert (y'_1 = Iter (MF.f m) 1 y'0).
      simpl in |- ×.
        assert (MF.f = cF).
        tauto.
      rewrite H18 in |- ×.
        unfold y'0 in |- ×.
        unfold cF in |- ×.
        rewrite cA_1_cA in |- ×.
       fold y'_1 in |- ×.
          tauto.
       tauto.
      unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
     rewrite H18 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       assert (j - i - 1 + 1 = j - i).
       omega.
     rewrite H19 in |- ×.
       clear H19.
       rewrite <- H3 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       assert (j - i + i = j).
       omega.
     rewrite H19 in |- ×.
        tauto.
    split.
     assert (y'_1 = Iter (MF.f m) 1 y'0).
      simpl in |- ×.
        assert (MF.f = cF).
        tauto.
      rewrite H18 in |- ×.
        unfold y'0 in |- ×.
        unfold cF in |- ×.
        rewrite cA_1_cA in |- ×.
       fold y'_1 in |- ×.
          tauto.
       tauto.
      unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
     rewrite H18 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       rewrite <- H3 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       fold p in H17.
       assert (p - 1 - i - 1 + 1 + i = p - 1).
       omega.
     rewrite H19 in |- ×.
       clear H19.
       rewrite <- MF.Iter_f_f_1 in |- ×.
      unfold p in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
       simpl in |- ×.
         assert (MF.f_1 = cF_1).
         tauto.
       rewrite H19 in |- ×.
         unfold cF_1 in |- ×.
         unfold x_1 in |- ×.
         rewrite cA_cA_1 in |- ×.
        fold x0 in |- ×.
           tauto.
       unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
       unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
      unfold m1 in H; simpl in H; unfold prec_L in H.
         tauto.
      unfold x_1 in |- ×.
        generalize (exd_cA_1 m one x).
        unfold m1 in H; simpl in H; unfold prec_L in H.
         tauto.
     unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
     generalize (exd_cA_1 m one x).
       unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
     unfold m1 in H; simpl in H; unfold prec_L in H.
        omega.
    split.
     fold p in H17.
        omega.
    fold p in H17.
       omega.
   unfold m1 in H; simpl in H; unfold prec_L in H.
      tauto.
   unfold x_1 in |- ×.
     generalize (exd_cA_1 m one x).
     unfold m1 in H; simpl in H; unfold prec_L in H.
      tauto.
  assert (betweenf m y'_1 y'_1 x0).
   unfold betweenf in |- ×.
     assert (expf m y'_1 x0).
    assert (expf m y'0 y'_1).
     unfold expf in |- ×.
       split.
      simpl in H11.
         tauto.
     unfold MF.expo in |- ×.
       split.
      unfold y'0 in |- ×.
        generalize (exd_cA m zero y').
        unfold m2 in H6; simpl in H6;
  unfold prec_L in H6; tauto.
     split with 1.
       simpl in |- ×.
       assert (MF.f = cF).
       tauto.
     rewrite H15 in |- ×.
       unfold y'0 in |- ×.
       unfold y'_1 in |- ×.
       unfold cF in |- ×.
       rewrite cA_1_cA in |- ×.
       tauto.
     unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
     unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
    assert (expf m x0 x_1).
     unfold expf in |- ×.
       split.
      simpl in H11.
         tauto.
     unfold MF.expo in |- ×.
       split.
      unfold x0 in |- ×.
        generalize (exd_cA m zero x).
        unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
     split with 1.
       simpl in |- ×.
       assert (MF.f = cF).
       tauto.
     rewrite H16 in |- ×.
       unfold x0 in |- ×.
       unfold cF in |- ×.
       rewrite cA_1_cA in |- ×.
      fold x_1 in |- ×.
         tauto.
     unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
     unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
    apply expf_trans with y'0.
     apply expf_symm.
        tauto.
    apply expf_trans with x'.
     apply expf_symm.
        tauto.
    rewrite H10 in |- ×.
      apply expf_symm.
       tauto.
   assert (MF.expo1 m y'_1 x0).
    generalize (MF.expo_expo1 m y'_1 x0).
      unfold expf in H15.
      simpl in H11.
       tauto.
   generalize (MF.between_expo_refl_1 m y'_1 x0).
     unfold expf in H15.
     unfold MF.expo in H15.
      tauto.
   tauto.
  tauto.
intro.
  assert (x_1b = x_1).
 rewrite H8 in |- ×.
   elim (eq_dart_dec y' x).
  intro.
    symmetry in a.
     tauto.
 elim (eq_dart_dec x'1 x).
   tauto.
 fold x_1 in |- ×.
    tauto.
rewrite H9 in H3.
  clear H8.
  generalize (expf_L0_CNS m x y x' y'0).
  simpl in |- ×.
  fold x_1 in |- ×.
  fold y_0 in |- ×.
  set (y_0_1 := cA_1 m one y_0) in |- ×.
  set (x0 := cA m zero x) in |- ×.
  elim (expf_dec m x_1 y).
 intros.
   assert
    (expf (L m zero x y) x' y'0
     betweenf m x_1 x' y betweenf m x_1 y'0 y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0 x0
     ¬ expf m x_1 x' expf m x' y'0).
  unfold m1 in H; simpl in H; unfold m2 in H6; simpl in H6;
   unfold prec_L in H6; tauto.
 clear H8.
   assert
    (betweenf m x_1 x' y betweenf m x_1 y'0 y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0 x0
     ¬ expf m x_1 x' expf m x' y'0).
   tauto.
 clear a.
   clear H10.
   elim H3.
   clear H3.
   set (x'10 := cA m zero x'1) in |- ×.
   set (y'_1 := cA_1 m one y') in |- ×.
   assert (inv_hmap (L m one x' y')).
  simpl in |- ×.
    unfold m2 in H6.
    simpl in H6.
     tauto.
 assert (exd m x_1).
  unfold x_1 in |- ×.
    generalize (exd_cA_1 m one x).
    unfold m1 in H.
    simpl in H.
    unfold prec_L in H.
     tauto.
 generalize (expf_L1_CNS m x' y' x_1 y H3 H10).
   simpl in |- ×.
   fold y'0 in |- ×.
   fold x'1 in |- ×.
   fold x'10 in |- ×.
   fold y'_1 in |- ×.
   elim (expf_dec m x' y'0).
  intros.
    clear a.
    fold y_0 in H4.
    assert (x' x_1).
   intro.
     unfold x'1 in b.
     rewrite H12 in b.
     unfold x_1 in b.
     rewrite cA_cA_1 in b.
     tauto.
   simpl in H3.
      tauto.
   unfold m1 in H.
     simpl in H.
     unfold prec_L in H.
      tauto.
  assert (y'0 y).
   intro.
     unfold y_0 in H4.
     rewrite <- H13 in H4.
     unfold y'0 in H4.
     rewrite cA_1_cA in H4.
     tauto.
   simpl in H3; tauto.
   simpl in H3; unfold prec_L in H3.
      tauto.
  assert (inv_hmap m).
   simpl in H3.
      tauto.
  assert (cF m y'0 = y'_1).
   unfold y'0 in |- ×.
     unfold y'_1 in |- ×.
     unfold cF in |- ×.
     rewrite cA_1_cA in |- ×.
     tauto.
    tauto.
   simpl in H3.
     unfold prec_L in H3.
      tauto.
  assert (cF_1 m x' = x'10).
   unfold x'10 in |- ×.
     unfold x'1 in |- ×.
     fold (cF_1 m x') in |- ×.
      tauto.
  elim H8.
   clear H8.
     intro.
     generalize (betweenf1 m x' y'0 x_1 y H14 H10 H12 H13 H8).
     rewrite H15 in |- ×.
     rewrite H16 in |- ×.
      tauto.
  intro.
    clear H8.
    elim H17.
   clear H17.
     intro.
     assert (y_0_1 = cF m y).
    unfold y_0_1 in |- ×.
      unfold y_0 in |- ×.
      fold (cF m y) in |- ×.
       tauto.
   assert (x0 = cF_1 m x_1).
    unfold x0 in |- ×.
      unfold cF_1 in |- ×.
      unfold x_1 in |- ×.
      rewrite cA_cA_1 in |- ×.
      tauto.
     tauto.
    unfold m1 in H.
      simpl in H.
      unfold prec_L in H.
       tauto.
   assert (exd m y).
    unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   generalize (betweenf2 m x' y'0 x_1 y H14 H19 H12 H13).
     rewrite <- H17 in |- ×.
     rewrite <- H18 in |- ×.
     rewrite H15 in |- ×.
     rewrite H16 in |- ×.
      tauto.
  clear H17.
    intro.
    decompose [and] H8.
    clear H8.
    assert (¬ expf m x' x_1).
   intro.
     elim H17.
     apply expf_symm.
      tauto.
   tauto.
  tauto.
 tauto.
Qed.


Open Scope nat_scope.

Lemma nf_L0L1_I: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
    expf m x' y'0
      expf (L m zero x y) x' y'0b
        ¬ expf (L m one x' y') x_1b y
     False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
unfold m1 in |- ×.
  unfold m2 in |- ×.
  set (mx := L m zero x y) in |- ×.
  set (mx' := L m one x' y') in |- ×.
  unfold nf in |- ×.
  fold nf in |- ×.
  unfold mx' in |- ×.
  fold x_1b in |- ×.
  unfold mx in |- ×.
  fold y'0b in |- ×.
  simpl in y'0b.
  elim (eq_dart_dec x y').
 intro.
   assert (y'0b = y).
  unfold y'0b in |- ×.
    elim (eq_dart_dec x y').
    tauto.
   tauto.
 rewrite H5 in H2.
   assert (x_1b = x').
  unfold x_1b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec y' x).
    tauto.
  intro.
    symmetry in a.
     tauto.
 rewrite H6 in H3.
   assert (betweenf m x_1 x' y).
  generalize (expf_L0_CNS m x y x' y).
    simpl in |- ×.
    fold x_1 in |- ×.
    fold y_0 in |- ×.
    intro.
    assert
     (betweenf m x_1 x' y betweenf m x_1 y y
      betweenf m (cA_1 m one y_0) x' (cA m zero x)
      betweenf m (cA_1 m one y_0) y (cA m zero x)
      ¬ expf m x_1 x' expf m x' y).
   unfold m1 in H.
     simpl in H.
     generalize H7.
     elim (expf_dec m x_1 y).
    assert (exd m x').
     unfold m2 in H4.
       simpl in H4.
       unfold prec_L in H4.
        tauto.
     tauto.
    tauto.
  clear H7.
    elim H8.
    tauto.
  intros.
    clear H8.
    elim H7.
   intros.
     clear H7.
     decompose [and] H8.
     clear H8.
     unfold betweenf in H9.
     unfold MF.between in H9.
     assert (inv_hmap m).
    unfold expf in H1.
       tauto.
   assert (exd m y).
    unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   assert (exd m (cA_1 m one y_0)).
    unfold y_0 in |- ×.
      fold (cF m y) in |- ×.
      generalize (exd_cF m y).
       tauto.
   assert
    ( i : nat,
        j : nat,
         Iter (MF.f m) i (cA_1 m one y_0) = y
         Iter (MF.f m) j (cA_1 m one y_0) = cA m zero x
         i j < MF.Iter_upb m (cA_1 m one y_0)).
     tauto.
   clear H9.
     elim H12.
     clear H12.
     intros i Hi.
     elim Hi.
     clear Hi.
     intros j Hj.
     decompose [and] Hj.
     clear Hj.
     assert (cA_1 m one y_0 = cF m y).
    unfold y_0 in |- ×.
       tauto.
   rewrite H14 in H15.
     rewrite H14 in H13.
     rewrite H14 in H9.
     set (p := MF.Iter_upb m (cF m y)) in |- ×.
     fold p in H15.
     assert (i = p - 1).
    apply (MF.unicity_mod_p m (cF m y) i (p - 1)).
     unfold m1 in H.
       simpl in |- ×.
        tauto.
    assert (exd m y).
     unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
    generalize (exd_cF m y).
      unfold m1 in H; simpl in H.
       tauto.
    fold p in |- ×.
       omega.
    fold p in |- ×.
       omega.
    rewrite H9 in |- ×.
      rewrite <- MF.Iter_f_f_1 in |- ×.
     simpl in |- ×.
       unfold p in |- ×.
       rewrite MF.Iter_upb_period in |- ×.
      rewrite cF_1_cF in |- ×.
        tauto.
      unfold m1 in H; simpl in H.
         tauto.
      unfold m1 in H; simpl in H; unfold prec_L in H.
         tauto.
     unfold m1 in H; simpl in H.
        tauto.
     unfold m1 in H; simpl in H.
        tauto.
    unfold m1 in H; simpl in H.
       tauto.
    unfold m1 in H; simpl in H.
       tauto.
     omega.
   assert (j = p - 1).
     omega.
   rewrite H16 in H9.
     rewrite H17 in H13.
     rewrite H9 in H13.
     unfold m1 in H; simpl in H; unfold prec_L in H.
     symmetry in H13.
      tauto.
  intro.
    clear H7.
    unfold y'0 in H1.
    rewrite <- a in H1.
    assert (expf m x_1 (cA m zero x)).
   assert (x_1 = cF m (cA m zero x)).
    unfold cF in |- ×.
      rewrite cA_1_cA in |- ×.
     fold x_1 in |- ×.
        tauto.
    unfold m1 in H; simpl in H.
       tauto.
    unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   apply expf_symm.
     rewrite H7 in |- ×.
     unfold expf in |- ×.
     split.
    unfold m1 in H; simpl in H.
       tauto.
   unfold MF.expo in |- ×.
     split.
    generalize (exd_cA m zero x).
      assert (inv_hmap m).
     unfold m1 in H; simpl in H.
        tauto.
    assert (exd m x).
     unfold m1 in H; simpl in H; unfold prec_L in H.
        tauto.
     tauto.
   split with 1.
     simpl in |- ×.
      tauto.
   absurd (expf m x_1 x').
    tauto.
  apply expf_trans with (cA m zero x).
    tauto.
  apply expf_symm.
     tauto.
 elim H3.
   assert (exd m x').
  unfold m2 in H4; simpl in H4; unfold prec_L in H4.
     tauto.
 assert (inv_hmap (L m one x' y')).
  unfold m2 in H4.
    simpl in H4.
    simpl in |- ×.
     tauto.
 generalize (expf_L1_CNS m x' y' x' y H9 H8).
   simpl in |- ×.
   intro.
   assert
    (expf (L m one x' y') x' y
     betweenf m x' x'
    (cA m zero y') betweenf m x' y (cA m zero y')
     betweenf m (cA_1 m one y') x' (cA m zero (cA m one x'))
     betweenf m (cA_1 m one y') y (cA m zero (cA m one x'))
     ¬ expf m x' x' expf m x' y).
  generalize H10.
    elim (expf_dec m x' (cA m zero y')).
    tauto.
  clear H10.
     tauto.
 clear H10.
   clear H3.
   assert (betweenf m x' y (cA m zero y')).
  rewrite <- a in |- ×.
    set (x0 := cA m zero x) in |- ×.
    unfold betweenf in H7.
    unfold MF.between in H7.
    unfold betweenf in |- ×.
    unfold MF.between in |- ×.
    intros.
    assert (exd m x).
   unfold m1 in H; simpl in H; unfold prec_L in H.
      tauto.
  assert (exd m x_1).
   unfold x_1 in |- ×.
     generalize (exd_cA_1 m one x).
      tauto.
  generalize (H7 H3 H13).
    intro.
    clear H7.
    elim H14.
    intros i Hi.
    elim Hi.
    intros j Hj.
    clear Hi H14.
    decompose [and] Hj.
    clear Hj.
    set (p := MF.Iter_upb m x_1) in |- ×.
    fold p in H17.
    assert (p = MF.Iter_upb m x').
   unfold p in |- ×.
     apply (MF.period_expo m x_1 x' H3).
     rewrite <- H7 in |- ×.
     unfold MF.expo in |- ×.
     split.
     tauto.
   split with i.
      tauto.
  rewrite <- H16 in |- ×.
    split with (j - i).
    split with (p - i - 1).
    split.
   rewrite <- H7 in |- ×.
     rewrite <- MF.Iter_comp in |- ×.
     assert (j - i + i = j). clear H11.
     omega.
   rewrite H18 in |- ×.
      tauto.
  split.
   rewrite <- H7 in |- ×.
     rewrite <- MF.Iter_comp in |- ×.
     assert (p - i - 1 + i = p - 1). clear H11.
     omega.
   rewrite H18 in |- ×.
     assert (x0 = Iter (MF.f_1 m) 1 x_1).
    simpl in |- ×.
      assert (MF.f_1 = cF_1).
      tauto.
    rewrite H19 in |- ×.
      unfold cF_1 in |- ×.
      unfold x0 in |- ×.
      unfold x_1 in |- ×.
      rewrite cA_cA_1 in |- ×.
      tauto.
     tauto.
     tauto.
   rewrite H19 in |- ×.
     rewrite <- MF.Iter_f_f_1 in |- ×.
    unfold p in |- ×.
      rewrite MF.Iter_upb_period in |- ×.
      tauto.
     tauto.
     tauto.
    tauto.
    tauto. clear H11.
    omega. clear H11.
   omega.
 assert (betweenf m x' x' (cA m zero y')).
  simpl in H9.
    generalize (MF.between_expo_refl_1 m x' (cA m zero y')).
    intros.
    fold y'0 in H10.
    unfold expf in H1.
    unfold betweenf in |- ×.
    fold y'0 in |- ×.
    assert (MF.expo1 m x' y'0).
   generalize (MF.expo_expo1 m x' y'0).
      tauto.
   tauto.
  tauto.
elim (eq_dart_dec (cA_1 m zero y) y').
 intros.
   assert (y'0b = cA m zero x).
  unfold y'0b in |- ×.
    elim (eq_dart_dec x y').
    tauto.
  elim (eq_dart_dec (cA_1 m zero y) y').
    tauto.
   tauto.
 set (x0 := cA m zero x) in |- ×.
   fold y_0 in a.
   assert (y'0 = y).
  unfold y'0 in |- ×.
    rewrite <- a in |- ×.
    unfold y_0 in |- ×.
    rewrite cA_cA_1 in |- ×.
    tauto.
  unfold m1 in H; simpl in m1.
    simpl in H.
     tauto.
  unfold m1 in H; simpl in H; unfold prec_L in H.
     tauto.
 set (y_0_1 := cA_1 m one y_0) in |- ×.
   assert (betweenf m y_0_1 x' x0).
  fold x0 in H5.
    rewrite H5 in H2.
    generalize (expf_L0_CNS m x y x' x0).
    simpl in |- ×.
    fold x_1 in |- ×.
    fold y_0 in |- ×.
    fold y_0_1 in |- ×.
    fold x0 in |- ×.
    intro.
    assert
     (betweenf m x_1 x' y betweenf m x_1 x0 y
      betweenf m y_0_1 x' x0 betweenf m y_0_1 x0 x0
      ¬ expf m x_1 x' expf m x' x0).
   unfold m1 in H.
     simpl in H.
     assert (exd m x').
    unfold m2 in H4.
      simpl in H4.
      unfold prec_L in H4.
       tauto.
   generalize H7.
     elim (expf_dec m x_1 y).
     tauto.
    tauto.
  clear H7.
    elim H8.
   intro.
     clear H8.
     decompose [and] H7.
     clear H7.
     unfold betweenf in H9.
     unfold MF.between in H9.
     assert (inv_hmap m).
    unfold expf in H1.
       tauto.
   assert (exd m x).
    unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   assert (exd m x_1).
    unfold x_1 in |- ×.
      generalize (exd_cA_1 m one x).
       tauto.
   elim H9.
    clear H9.
      intros i Hi.
      elim Hi.
      clear Hi.
      intros j Hj.
      decompose [and] Hj.
      clear Hj.
      set (p := MF.Iter_upb m x_1) in |- ×.
      fold p in H15.
      assert (x_1 = cF m x0).
     unfold x_1 in |- ×.
       unfold cF in |- ×.
       unfold x0 in |- ×.
       rewrite cA_1_cA in |- ×.
       tauto.
      tauto.
      tauto.
    assert (i = p - 1).
     apply (MF.unicity_mod_p m x_1 i (p - 1)).
       tauto.
      tauto.
     fold p in |- ×.
        omega.
     fold p in |- ×.
        omega.
     rewrite H9 in |- ×.
       unfold p in |- ×.
       rewrite <- MF.Iter_f_f_1 in |- ×.
      simpl in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
       rewrite H14 in |- ×.
         assert (MF.f_1 = cF_1).
         tauto.
       rewrite H16 in |- ×.
         rewrite cF_1_cF in |- ×.
         tauto.
        tauto.
       unfold x0 in |- ×.
         generalize (exd_cA m zero x).
          tauto.
       tauto.
       tauto.
      tauto.
      tauto.
     fold p in |- ×.
        omega.
    assert (j = p - 1).
      omega.
    rewrite H16 in H9.
      rewrite H17 in H13.
      rewrite H9 in H13; unfold x0 in H13.
      unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
    tauto.
    tauto.
  intro.
    clear H8.
    elim H7.
   clear H7.
     intro.
      tauto.
  clear H7.
    intro.
     absurd (expf m x_1 x').
    tauto.
  apply expf_trans with y.
    tauto.
  apply expf_symm.
    rewrite <- H6 in |- ×.
     tauto.
 elim H3.
   simpl in x_1b.
   assert (cA m one x' x).
  intro.
    assert (x' = x_1).
   unfold x_1 in |- ×.
     rewrite <- H8 in |- ×.
     rewrite cA_1_cA in |- ×.
     tauto.
   unfold m1 in H; simpl in H; unfold prec_L in H.
      tauto.
   unfold m2 in H4; simpl in H4; unfold prec_L in H4.
      tauto.
  rewrite H9 in H7.
    assert (inv_hmap m).
   unfold m1 in H; simpl in H.
      tauto.
  assert (exd m y).
   unfold m1 in H; simpl in H; unfold prec_L in H.
      tauto.
  assert (exd m y_0_1).
   unfold y_0_1 in |- ×.
     unfold y_0 in |- ×.
     fold (cF m y) in |- ×.
     generalize (exd_cF m y).
      tauto.
  unfold betweenf in H7.
    unfold MF.between in H7.
    elim H7.
   intros i Hi.
     elim Hi; intros j Hj.
     clear Hi.
     clear H7.
     decompose [and] Hj.
     clear Hj.
     set (p := MF.Iter_upb m y_0_1) in |- ×.
     fold p in H16.
     assert (x_1 = cF m x0).
    unfold x0 in |- ×.
      unfold x_1 in |- ×.
      unfold cF in |- ×.
      rewrite cA_1_cA in |- ×.
      tauto.
     tauto.
    unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   rewrite H15 in H7.
     elim (eq_nat_dec i (p - 1)).
    intro.
      assert (j = p - 1).
      omega.
    rewrite H17 in H14.
      rewrite <- MF.Iter_f_f_1 in H14.
     unfold p in H14.
       rewrite MF.Iter_upb_period in H14.
      simpl in H14.
        assert (MF.f_1 = cF_1).
        tauto.
      rewrite H18 in H14.
        unfold y_0_1 in H14.
        unfold cF_1 in H14.
        rewrite cA_cA_1 in H14.
       unfold y_0 in H14.
         rewrite cA_cA_1 in H14.
        symmetry in H14.
          unfold x0 in H14.
          unfold m1 in H; simpl in H; unfold prec_L in H.
           tauto.
        tauto.
        tauto.
       tauto.
      unfold y_0 in |- ×.
        generalize (exd_cA_1 m zero y).
         tauto.
      tauto.
      tauto.
     tauto.
     tauto.
     omega.
   intro.
     assert (i 0).
    intro.
      rewrite H17 in H7.
      simpl in H7.
      generalize H7.
      unfold y_0_1 in |- ×.
      unfold y_0 in |- ×.
      fold (cF m y) in |- ×.
      intros.
      assert (x0 = y).
     rewrite <- (cF_1_cF m y) in |- ×.
      rewrite H18 in |- ×.
        rewrite cF_1_cF in |- ×.
        tauto.
       tauto.
      unfold x0 in |- ×.
        generalize (exd_cA m zero x).
        unfold m1 in H; simpl in H; unfold prec_L in H.
         tauto.
      tauto.
      tauto.
    unfold x0 in H19.
      unfold m1 in H; simpl in H; unfold prec_L in H.
       tauto.
   assert (j = i - 1).
    apply (MF.unicity_mod_p m y_0_1 j (i - 1)).
      tauto.
     tauto.
    fold p in |- ×.
       omega.
    fold p in |- ×.
       omega.
    rewrite H14 in |- ×.
      rewrite <- MF.Iter_f_f_1 in |- ×.
     simpl in |- ×.
       rewrite H7 in |- ×.
       assert (MF.f_1 = cF_1).
       tauto.
     rewrite H18 in |- ×.
       rewrite cF_1_cF in |- ×.
       tauto.
      tauto.
     unfold x0 in |- ×.
       generalize (exd_cA m zero x).
       unfold m1 in H.
       simpl in H.
       unfold prec_L in H.
        tauto.
     tauto.
     tauto.
     omega.
    omega.
   tauto.
   tauto.
 assert (x_1b = x_1).
  unfold x_1b in |- ×.
    elim (eq_dart_dec y' x).
   intro.
     symmetry in a0; tauto.
  elim (eq_dart_dec (cA m one x') x).
    tauto.
  fold x_1 in |- ×.
     tauto.
 rewrite H9 in |- ×.
   generalize (expf_L1_CNS m x' y' x_1 y).
   assert (inv_hmap (L m one x' y')).
  unfold m2 in H4.
    simpl in H4.
    simpl in |- ×.
     tauto.
 assert (exd m x).
  unfold m1 in H.
    simpl in H.
    unfold prec_L in H.
     tauto.
 assert (exd m x_1).
  unfold x_1 in |- ×.
    generalize (exd_cA_1 m one x).
    simpl in H10.
     tauto.
 intro.
   simpl in H13.
   fold y'0 in H13.
   fold x'1 in H13.
   assert
    (expf (L m one x' y') x_1 y
     betweenf m x' x_1 y'0 betweenf m x' y y'0
     betweenf m (cA_1 m one y') x_1 (cA m zero x'1)
     betweenf m (cA_1 m one y') y (cA m zero x'1)
     ¬ expf m x' x_1 expf m x_1 y).
  generalize H13.
    elim (expf_dec m x' y'0).
    tauto.
   tauto.
 clear H13.
   assert (betweenf m x' x_1 y'0).
  rewrite H6 in |- ×.
    unfold betweenf in H7.
    unfold MF.between in H7.
    assert (exd m y_0).
   unfold y_0 in |- ×.
     generalize (exd_cA_1 m zero y).
     unfold m1 in H; simpl in H; unfold prec_L in H.
      tauto.
  assert (exd m y_0_1).
   unfold y_0_1 in |- ×.
     generalize (exd_cA_1 m one y_0).
     simpl in H10.
      tauto.
  elim H7.
   clear H7.
     intros i Hi.
     elim Hi.
     clear Hi.
     intros j Hj.
     decompose [and] Hj.
     clear Hj.
     set (p := MF.Iter_upb m y_0_1) in |- ×.
     fold p in H19.
     unfold betweenf in |- ×.
     unfold MF.between in |- ×.
     intros.
     split with (j - i + 1).
     split with (p - 1 - i).
     assert (i 0).
    intro.
      rewrite H21 in H7.
      simpl in H7.
      assert (cA m one x' = y').
     rewrite <- H7 in |- ×.
       unfold y_0_1 in |- ×.
       rewrite a in |- ×.
       rewrite cA_cA_1 in |- ×.
       tauto.
      tauto.
     unfold m2 in H4; simpl in H4; unfold prec_L in H4.
        tauto.
    unfold m2 in H4; simpl in H4; unfold prec_L in H4.
       tauto.
   assert (p = MF.Iter_upb m x').
    unfold p in |- ×.
      apply (MF.period_expo m y_0_1 x').
      tauto.
    unfold MF.expo in |- ×.
      split.
      tauto.
    split with i.
      apply H7.
   rewrite <- H22 in |- ×.
     split.
    assert (j - i + 1 = S (j - i)). clear H14.
      omega.
    rewrite <- H7 in |- ×.
      rewrite <- MF.Iter_comp in |- ×.
      assert (j - i + 1 + i = S j). clear H14.
      omega.
    rewrite H24 in |- ×.
      clear H23 H24.
      simpl in |- ×.
      rewrite H17 in |- ×.
      unfold x_1 in |- ×.
      unfold x0 in |- ×.
      assert (MF.f = cF).
      tauto.
    rewrite H23 in |- ×.
      unfold cF in |- ×.
      rewrite cA_1_cA in |- ×.
      tauto.
     tauto.
     tauto.
   split.
    rewrite <- H7 in |- ×.
      rewrite <- MF.Iter_comp in |- ×.
      assert (p - 1 - i + i = p - 1). clear H14.
      omega.
    rewrite H23 in |- ×.
      clear H23.
      rewrite <- MF.Iter_f_f_1 in |- ×.
     simpl in |- ×.
       unfold p in |- ×.
       rewrite MF.Iter_upb_period in |- ×.
      unfold y_0_1 in |- ×.
        unfold y_0 in |- ×.
        fold (cF m y) in |- ×.
        assert (MF.f_1 = cF_1).
        tauto.
      rewrite H23 in |- ×.
        rewrite cF_1_cF in |- ×.
        tauto.
       tauto.
      unfold m1 in H; simpl in H; unfold prec_L in H.
         tauto.
      tauto.
      tauto.
     tauto.
     tauto. clear H14.
     omega.
   split.
    elim (eq_nat_dec j (p - 1)).
     intro.
       rewrite a0 in H17.
       rewrite <- MF.Iter_f_f_1 in H17.
      simpl in H17.
        unfold p in H17.
        rewrite MF.Iter_upb_period in H17.
       assert (x0 = y).
        rewrite <- H17 in |- ×.
          unfold y_0_1 in |- ×.
          unfold y_0 in |- ×.
          fold (cF m y) in |- ×.
          assert (MF.f_1 = cF_1).
          tauto.
        rewrite H23 in |- ×.
          rewrite cF_1_cF in |- ×.
          tauto.
         tauto.
        unfold m1 in H; simpl in H; unfold prec_L in H.
           tauto.
       unfold x0 in H23.
         unfold m1 in H; simpl in H; unfold prec_L in H.
          tauto.
       tauto.
       tauto.
      tauto.
      tauto. clear H14.
      omega.
    intros. clear H14.
       omega. clear H14.
    omega.
  simpl in H10.
     tauto.
   tauto.
 assert (betweenf m x' y y'0).
  rewrite H6 in |- ×.
    unfold betweenf in |- ×.
    generalize (MF.between_expo_refl_2 m x' y).
    assert (MF.expo1 m x' y).
   rewrite H6 in H1.
     generalize (MF.expo_expo1 m x' y).
     simpl in H10.
     unfold expf in H1.
      tauto.
  simpl in H10.
    unfold prec_L in H10.
     tauto.
  tauto.
apply (nf_L0L1_IA m x y x' y' H H0 H1 H2 H3).
Qed.


Open Scope nat_scope.

Lemma nf_L0L1_IIA: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     expf m x' y'0
       ¬ expf (L m zero x y) x' y'0b
           expf (L m one x' y') x_1b y
       x = y'
     False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
unfold m1 in |- ×.
  unfold m2 in |- ×.
  set (mx := L m zero x y) in |- ×.
  set (mx' := L m one x' y') in |- ×.
  unfold nf in |- ×.
  fold nf in |- ×.
  unfold mx' in |- ×.
  fold x_1b in |- ×.
  unfold mx in |- ×.
  fold y'0b in |- ×.
  rename H4 into a.
  rename H5 into H4.
  assert (y'0b = y).
 unfold y'0b in |- ×.
   simpl in |- ×.
   elim (eq_dart_dec x y').
   tauto.
  tauto.
rewrite H5 in H2.
  assert (x_1b = x').
 unfold x_1b in |- ×.
   simpl in |- ×.
   elim (eq_dart_dec y' x).
   tauto.
 intro.
   symmetry in a.
    tauto.
rewrite H6 in H3.
  assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold m2 in H4.
   simpl in H4.
    tauto.
assert (exd m x').
 unfold m2 in H4; simpl in H4; unfold prec_L in H4.
    tauto.
generalize (expf_L1_CNS m x' y' x' y H7 H8).
  simpl in |- ×.
  fold y'0 in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  elim (expf_dec m x' y'0).
 intros.
   clear a0.
   assert
    (betweenf m x' x' y'0 betweenf m x' y y'0
     betweenf m y'_1 x' x'10 betweenf m y'_1 y x'10
     ¬ expf m x' x' expf m x' y).
   tauto.
 clear H9.
   elim H2.
   assert (inv_hmap (L m zero x y)).
  simpl in |- ×.
    unfold m1 in H.
    simpl in H.
     tauto.
 generalize (expf_L0_CNS m x y x' y H9 H8).
   simpl in |- ×.
   fold x_1 in |- ×.
   fold y_0 in |- ×.
   set (y_0_1 := cA_1 m one y_0) in |- ×.
   set (x0 := cA m zero x) in |- ×.
   elim (expf_dec m x_1 y).
  intro.
    clear a0.
    intro.
    elim (eq_nat_dec x' y).
   intro.
     rewrite a0 in |- ×.
     apply expf_refl.
     tauto.
   simpl in |- ×.
     rewrite <- a0 in |- ×.
      tauto.
  intro.
    elim H10.
   intros.
     clear H10.
     decompose [and] H12.
     clear H12.
     unfold betweenf in H13.
     unfold MF.between in H13.
     elim H13.
    intros i Hi.
      elim Hi.
      intros j Hj.
      decompose [and] Hj.
      clear H13 Hi Hj.
      assert (betweenf m x_1 x' y).
     unfold betweenf in |- ×.
       unfold MF.between in |- ×.
       intros.
       elim (eq_dart_dec x_1 x').
      intro.
        rewrite <- a0 in |- ×.
        split with 0.
        split with i.
        simpl in |- ×.
        split.
        tauto.
      split.
       rewrite a0 in |- ×.
          tauto.
      rewrite a0 in |- ×. clear H11.
         omega.
     intro.
       assert (y'0 = x0).
      unfold y'0 in |- ×.
        unfold x0 in |- ×.
        rewrite a in |- ×.
         tauto.
     set (p := MF.Iter_upb m x') in |- ×.
       fold p in H17.
       assert (j p - 1).
      intro.
        rewrite H19 in H15.
        unfold p in H15.
        rewrite <- MF.Iter_f_f_1 in H15.
       simpl in H15.
         rewrite MF.Iter_upb_period in H15.
        rewrite H18 in H15.
          assert (MF.f_1 = cF_1).
          tauto.
        rewrite H20 in H15.
          assert (x' = cF m x0).
         rewrite <- H15 in |- ×.
           rewrite cF_cF_1 in |- ×.
           tauto.
          tauto.
         unfold m2 in H4; simpl in H4; unfold prec_L in H4.
            tauto.
        unfold cF in H21.
          unfold x0 in H21.
          rewrite cA_1_cA in H21.
         fold x_1 in H21.
           symmetry in H21.
            tauto.
         tauto.
        simpl in H19.
          simpl in H9; unfold prec_L in H9; tauto.
        tauto.
       unfold m2 in H4; simpl in H4; unfold prec_L in H4.
          tauto.
       tauto.
      unfold m2 in H4; simpl in H4; unfold prec_L in H4.
         tauto.
      fold p in |- ×. clear H11.
         omega.
     assert (expf m x' x_1).
      apply expf_trans with y'0.
        tauto.
      rewrite H18 in |- ×.
        unfold expf in |- ×.
        split.
        tauto.
      unfold MF.expo in |- ×.
        split.
       unfold x0 in |- ×.
         generalize (exd_cA m zero x).
         simpl in H9; unfold prec_L in H9; tauto.
      split with 1.
        simpl in |- ×.
        assert (MF.f = cF).
        tauto.
      rewrite H20 in |- ×.
        unfold cF in |- ×.
        unfold x0 in |- ×.
        rewrite cA_1_cA in |- ×.
       fold x_1 in |- ×.
          tauto.
       tauto.
      simpl in H9; unfold prec_L in H9; tauto.
     assert (p = MF.Iter_upb m x_1).
      unfold p in |- ×.
        apply MF.period_expo.
        tauto.
      unfold expf in H20.
         tauto.
     rewrite <- H21 in |- ×.
       split with (p - (j + 1)).
       split with (p + i - (j + 1)).
       split.
      assert (x_1 = Iter (MF.f m) 1 x0).
       simpl in |- ×.
         assert (MF.f = cF).
         tauto.
       rewrite H22 in |- ×.
         unfold cF in |- ×.
         unfold x0 in |- ×.
         rewrite cA_1_cA in |- ×.
        fold x_1 in |- ×.
           tauto.
        tauto.
       simpl in H9; unfold prec_L in H9.
          tauto.
      rewrite H22 in |- ×.
        rewrite <- MF.Iter_comp in |- ×.
        assert (p - (j + 1) + 1 = p - j). clear H11.
        omega.
      rewrite H23 in |- ×.
        rewrite <- H18 in |- ×.
        rewrite <- H15 in |- ×.
        rewrite <- MF.Iter_comp in |- ×.
        clear H23.
        assert (p - j + j = p). clear H11.
        omega.
      rewrite H23 in |- ×.
        unfold p in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
        tauto.
       tauto.
      unfold m2 in H4; simpl in H4; unfold prec_L in H4.
         tauto.
     split.
      assert (x_1 = Iter (MF.f m) 1 x0).
       simpl in |- ×.
         assert (MF.f = cF).
         tauto.
       rewrite H22 in |- ×.
         unfold cF in |- ×.
         unfold x0 in |- ×.
         rewrite cA_1_cA in |- ×.
        fold x_1 in |- ×.
           tauto.
        tauto.
       simpl in H9; unfold prec_L in H9.
          tauto.
      rewrite H22 in |- ×.
        rewrite <- MF.Iter_comp in |- ×.
        assert (p + i - (j + 1) + 1 = p + i - j). clear H11.
        omega.
      rewrite H23 in |- ×.
        clear H23.
        rewrite <- H18 in |- ×.
        rewrite <- H15 in |- ×.
        rewrite <- MF.Iter_comp in |- ×.
        assert (p + i - j + j = p + i). clear H11.
        omega.
      rewrite H23 in |- ×.
        clear H23.
        rewrite MF.Iter_comp in |- ×.
        rewrite H12 in |- ×.
        unfold p in |- ×.
        assert (expf m x' y).
       apply expf_trans with y'0.
         tauto.
       rewrite H18 in |- ×.
         apply expf_trans with x_1.
        unfold expf in |- ×.
          split.
          tauto.
        unfold MF.expo in |- ×.
          split.
         unfold x0 in |- ×.
           generalize (exd_cA m zero x).
           simpl in H9; unfold prec_L in H9.
            tauto.
        split with 1.
          simpl in |- ×.
          assert (MF.f = cF).
          tauto.
        rewrite H23 in |- ×.
          unfold x0 in |- ×.
          unfold cF in |- ×.
          rewrite cA_1_cA in |- ×.
         fold x_1 in |- ×.
            tauto.
         tauto.
        simpl in H9; unfold prec_L in H9; tauto.
        tauto.
      assert (p = MF.Iter_upb m y).
       unfold p in |- ×.
         apply MF.period_expo.
         tauto.
       unfold expf in H23.
          tauto.
      fold p in |- ×.
        rewrite H24 in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
        tauto.
       tauto.
      simpl in H9.
        unfold prec_L in H9.
         tauto. clear H11.
      omega.
    assert (betweenf m x_1 y y).
     unfold betweenf in |- ×.
       assert (MF.expo1 m x_1 y).
      generalize (MF.expo_expo1 m x_1 y).
        unfold expf in H0.
         tauto.
     assert (exd m x_1).
      unfold x_1 in |- ×.
        generalize (exd_cA_1 m one x).
        simpl in H9.
        unfold prec_L in H9.
         tauto.
     generalize (MF.between_expo_refl_2 m x_1 y).
       simpl in H7.
        tauto.
     tauto.
   simpl in H7.
      tauto.
    tauto.
  intro.
    elim H12.
   clear H12.
     clear H10.
     intro.
     decompose [and] H10.
     clear H10.
     elim (eq_dart_dec x' x_1).
    intro.
      rewrite a0 in H11.
      assert (betweenf m x_1 x_1 y).
     unfold betweenf in |- ×.
       assert (MF.expo1 m x_1 y).
      assert (exd m x_1).
       unfold x_1 in |- ×.
         generalize (exd_cA_1 m one x).
         simpl in H9.
         unfold prec_L in H9.
          tauto.
      generalize (MF.expo_expo1 m x_1 y).
        unfold expf in H0.
         tauto.
     assert (exd m x_1).
      unfold x_1 in |- ×.
        generalize (exd_cA_1 m one x).
        simpl in H9.
        unfold prec_L in H9.
         tauto.
     generalize (MF.between_expo_refl_1 m x_1 y).
       simpl in H7.
        tauto.
    assert (betweenf m x_1 y y).
     unfold betweenf in |- ×.
       assert (MF.expo1 m x_1 y).
      generalize (MF.expo_expo1 m x_1 y).
        unfold expf in H0.
         tauto.
     assert (exd m x_1).
      unfold x_1 in |- ×.
        generalize (exd_cA_1 m one x).
        simpl in H9.
        unfold prec_L in H9.
         tauto.
     generalize (MF.between_expo_refl_2 m x_1 y).
       simpl in H7.
        tauto.
    rewrite a0 in |- ×.
       tauto.
   intro.
     assert (y'_1 = x_1).
    unfold x_1 in |- ×.
      unfold y'_1 in |- ×.
      rewrite a in |- ×.
       tauto.
   rewrite H10 in H12.
     unfold betweenf in H12.
     unfold MF.between in H12.
     elim H12.
    intros i Hi.
      elim Hi.
      intros j Hj.
      elim Hj.
      intros.
      decompose [and] H15.
      clear Hi Hj H12 H15.
      set (p := MF.Iter_upb m x_1) in |- ×.
      fold p in H19.
      assert (S j p).
     intro.
       assert (Iter (MF.f m) (S j) x_1 = x_1).
      rewrite H12 in |- ×.
        unfold p in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
        tauto.
      simpl in H9; unfold prec_L in H9.
         tauto.
      assert (exd m x_1).
       unfold x_1 in |- ×.
         generalize (exd_cA_1 m one x).
         simpl in H9.
         unfold prec_L in H9.
          tauto.
       tauto.
     simpl in H15.
       rewrite H16 in H15.
       assert (MF.f = cF).
       tauto.
     rewrite H17 in H15.
       unfold cF in H15.
       unfold x'10 in H15.
       unfold x'1 in H15.
       rewrite cA_1_cA in H15.
      rewrite cA_1_cA in H15.
        tauto.
      simpl in H9.
        unfold prec_L in H9.
         tauto.
       tauto.
     simpl in H9.
       unfold prec_L in H9.
        tauto.
     simpl in H9.
       unfold prec_L in H9.
       generalize (exd_cA m one x'); simpl in H9.
       unfold prec_L in H9.
        tauto.
    assert (S j = i).
     apply (MF.unicity_mod_p m x_1 (S j) i).
      simpl in H9; unfold prec_L in H9.
         tauto.
     assert (exd m x_1).
      unfold x_1 in |- ×.
        generalize (exd_cA_1 m one x).
        simpl in H9.
        unfold prec_L in H9.
         tauto.
      tauto.
     fold p in |- ×. clear H11.
        omega.
     fold p in |- ×. clear H11.
        omega.
     simpl in |- ×.
       rewrite H14 in |- ×.
       rewrite H16 in |- ×.
       assert (MF.f = cF).
       tauto.
     rewrite H15 in |- ×.
       unfold cF in |- ×.
       unfold x'10 in |- ×.
       unfold x'1 in |- ×.
       rewrite cA_1_cA in |- ×.
      rewrite cA_1_cA in |- ×.
        tauto.
      simpl in H9.
        unfold prec_L in H9.
         tauto.
       tauto.
     simpl in H9.
       unfold prec_L in H9.
        tauto.
     generalize (exd_cA m one x'); simpl in H9.
       unfold prec_L in H9.
        tauto.
     absurd (S j = i). clear H11.
      omega.
     tauto.
   unfold prec_L in H9.
     unfold prec_L in H9.
     simpl in H9.
      tauto.
   generalize (exd_cA_1 m one x).
     simpl in H9.
     unfold prec_L in H9.
      tauto.
  clear H12.
    clear H10.
    intro.
     absurd (expf m x' x').
    tauto.
  apply expf_refl.
   simpl in H9.
      tauto.
   tauto.
  tauto.
 tauto.
Qed.


Open Scope nat_scope.

Lemma nf_L0L1_IIB: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     expf m x' y'0
       ¬ expf (L m zero x y) x' y'0b
           expf (L m one x' y') x_1b y
       x y' y_0 = y'
     False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (y'0b = x0).
 unfold y'0b in |- ×.
   simpl in |- ×.
   elim (eq_dart_dec x y').
   tauto.
 elim (eq_dart_dec (cA_1 m zero y) y').
   tauto.
  tauto.
assert (x_1b = cA_1 (L m one x' y') one x).
 fold x_1b in |- ×.
    tauto.
generalize H8.
  clear H8.
  simpl in |- ×.
  elim (eq_dart_dec y' x).
 intro.
   symmetry in a.
    tauto.
elim (eq_dart_dec (cA m one x') x).
 fold x'1 in |- ×.
   set (y'_1 := cA_1 m one y') in |- ×.
   intros.
   rewrite H7 in H2.
   rewrite H8 in H3.
   assert (inv_hmap (L m one x' y')).
  simpl in |- ×.
    unfold m2 in H6.
    simpl in H6.
     tauto.
 assert (inv_hmap m).
  simpl in H9.
     tauto.
 assert (exd m x').
  simpl in H9; unfold prec_L in H9.
     tauto.
 assert (exd m x).
  unfold m1 in H.
    simpl in H.
    unfold prec_L in H.
     tauto.
 assert (exd m y).
  unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
 assert (exd m y').
  unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
 assert (exd m y'_1).
  generalize (exd_cA_1 m one y').
    unfold y'_1 in |- ×.
     tauto.
 generalize (expf_L1_CNS m x' y' y'_1 y H9 H15).
   simpl in |- ×.
   fold y'0 in |- ×.
   fold x'1 in |- ×.
   set (x'10 := cA m zero x'1) in |- ×.
   fold y'_1 in |- ×.
   elim (expf_dec m x' y'0).
  intros.
    clear a0.
    assert
     (betweenf m x' y'_1 y'0 betweenf m x' y y'0
      betweenf m y'_1 y'_1 x'10 betweenf m y'_1 y x'10
      ¬ expf m x' y'_1 expf m y'_1 y).
    tauto.
  clear H16.
    clear H3.
    elim H2.
    assert (inv_hmap (L m zero x y)).
   simpl in |- ×.
     unfold m1 in H.
     simpl in H.
      tauto.
  generalize (expf_L0_CNS m x y x' x0 H3 H11).
    simpl in |- ×.
    fold x_1 in |- ×.
    fold y_0 in |- ×.
    fold x0 in |- ×.
    set (y_0_1 := cA_1 m one y_0) in |- ×.
    elim (expf_dec m x_1 y).
   intro.
     clear a0.
     intro.
     elim (eq_dart_dec x' x0).
    intro.
      rewrite <- a0 in |- ×.
      apply expf_refl.
      tauto.
    simpl in |- ×.
       tauto.
   intro.
     clear H2.
     clear b.
     elim H17.
    intro.
      decompose [and] H2.
      clear H2 H17.
      unfold betweenf in H18.
      unfold MF.between in H18.
      elim H18.
     intros i Hi.
       elim Hi.
       intros j Hj.
       decompose [and] Hj.
       clear Hj Hi H18.
       assert (i 0).
      intro.
        rewrite H18 in H2.
        simpl in H2.
        assert (x'1 = y').
       unfold x'1 in |- ×.
         rewrite H2 in |- ×.
         unfold y'_1 in |- ×.
         rewrite cA_cA_1 in |- ×.
         tauto.
        tauto.
        tauto.
      rewrite a in H21.
         tauto.
     assert (y'_1 = cF m y'0).
      unfold y'_1 in |- ×.
        unfold y'0 in |- ×.
        unfold cF in |- ×.
        rewrite cA_1_cA in |- ×.
        tauto.
       tauto.
       tauto.
     assert (MF.f = cF).
       tauto.
     set (p := MF.Iter_upb m x') in |- ×.
       assert (S j p).
      intro.
        assert (Iter (MF.f m) (S j) x' = x').
       rewrite H24 in |- ×.
         unfold p in |- ×.
         rewrite MF.Iter_upb_period in |- ×.
         tauto.
        tauto.
        tauto.
      simpl in H25.
        rewrite H20 in H25.
        rewrite H23 in H25.
        rewrite <- H21 in H25.
        unfold y'_1 in H25.
        assert (y' = x'1).
       unfold x'1 in |- ×.
         rewrite <- H25 in |- ×.
         rewrite cA_cA_1 in |- ×.
         tauto.
        tauto.
        tauto.
      rewrite a in H26.
        symmetry in H26.
         tauto.
     assert (S j = i).
      apply (MF.unicity_mod_p m x' (S j) i).
        tauto.
       tauto.
      fold p in |- ×.
        fold p in H22. clear H16.
         omega.
      fold p in |- ×.
        fold p in H22. clear H16.
         omega.
      rewrite H2 in |- ×.
        simpl in |- ×.
        rewrite H20 in |- ×.
        rewrite H23 in |- ×.
        symmetry in |- ×.
         tauto.
      absurd (S j = i). clear H16.
       omega.
      tauto.
     tauto.
     tauto.
   clear H17.
     intro.
     elim H2.
    clear H2.
      intro.
      decompose [and] H2.
      clear H2.
      assert (x'10 = x0).
     unfold x'10 in |- ×.
       rewrite a in |- ×.
       fold x0 in |- ×.
        tauto.
    assert (y'_1 = y_0_1).
     unfold y'_1 in |- ×.
       rewrite <- H5 in |- ×.
       fold y_0_1 in |- ×.
        tauto.
    rewrite H19 in H18.
      rewrite H2 in H18.
      assert (y_0_1 = cF m y).
     unfold y_0_1 in |- ×.
       unfold y_0 in |- ×.
       fold (cF m y) in |- ×.
        tauto.
    unfold betweenf in H18.
      unfold MF.between in H18.
      assert (exd m y_0_1).
     rewrite H20 in |- ×.
       generalize (exd_cF m y).
        tauto.
    generalize (H18 H10 H21).
      intro.
      clear H18.
      elim H22.
      intros i Hi.
      elim Hi.
      intros j Hj.
      decompose [and] Hj.
      clear Hj Hi H22.
      set (p := MF.Iter_upb m y_0_1) in |- ×.
      fold p in H26.
      assert (i = p - 1).
     apply (MF.unicity_mod_p m y_0_1 i (p - 1)).
       tauto; tauto.
      tauto.
     fold p in |- ×. clear H16.
        omega.
     fold p in |- ×. clear H16.
        omega.
     rewrite H18 in |- ×.
       rewrite <- MF.Iter_f_f_1 in |- ×.
      simpl in |- ×.
        unfold p in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
       assert (MF.f_1 = cF_1).
         tauto.
       rewrite H22 in |- ×.
         rewrite H20 in |- ×.
         rewrite cF_1_cF in |- ×.
         tauto.
        tauto.
        tauto.
       tauto.
       tauto.
      tauto.
      tauto. clear H16.
      omega.
    assert (i = j). clear H16.
      omega.
    rewrite H25 in H18.
      rewrite H24 in H18.
      unfold x0 in H18.
      unfold m1 in H.
      simpl in H.
      unfold prec_L in H.
       tauto.
   clear H2.
     intro.
      absurd (expf m x' y'_1).
     tauto.
   apply expf_trans with y'0.
     tauto.
   unfold expf in |- ×.
     split.
     tauto.
   unfold MF.expo in |- ×.
     split.
    unfold y'0 in |- ×.
      generalize (exd_cA m zero y').
       tauto.
   split with 1.
     simpl in |- ×.
     unfold y'0 in |- ×.
     assert (MF.f = cF).
     tauto.
   rewrite H17 in |- ×.
     unfold cF in |- ×.
     rewrite cA_1_cA in |- ×.
    fold y'_1 in |- ×.
       tauto.
    tauto.
    tauto.
   tauto.
  tauto.
intros.
  fold x_1 in H8.
  rewrite H8 in H3.
  rewrite H7 in H2.
  fold x'1 in b.
  clear b0.
  assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold m2 in H6.
   simpl in H6.
    tauto.
assert (inv_hmap m).
 simpl in H9.
    tauto.
assert (exd m x').
 simpl in H9; unfold prec_L in H9.
    tauto.
assert (exd m x).
 unfold m1 in H.
   simpl in H.
   unfold prec_L in H.
    tauto.
assert (exd m y).
 unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
assert (exd m y').
 unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
assert (exd m x_1).
 generalize (exd_cA_1 m one x).
   unfold x_1 in |- ×.
    tauto.
generalize (expf_L1_CNS m x' y' x_1 y H9 H15).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
 intros.
   clear a.
   assert
    (betweenf m x' x_1 y'0 betweenf m x' y y'0
     betweenf m y'_1 x_1 x'10 betweenf m y'_1 y x'10
     ¬ expf m x' x_1 expf m x_1 y).
   tauto.
 clear H16.
   clear H3.
   assert (inv_hmap (L m zero x y)).
  simpl in |- ×.
    unfold m1 in H.
    simpl in H.
     tauto.
 generalize (expf_L0_CNS m x y x' x0 H3 H11).
   simpl in |- ×.
   fold x_1 in |- ×.
   fold y_0 in |- ×.
   fold x0 in |- ×.
   set (y_0_1 := cA_1 m one y_0) in |- ×.
   elim (expf_dec m x_1 y).
  intro.
    clear a.
    intro.
    elim H2.
    clear H2.
    elim (eq_dart_dec x' x0).
   intro.
     simpl in |- ×.
     rewrite <- a in |- ×.
     apply expf_refl.
     tauto.
   simpl in |- ×.
      tauto.
  intro.
    elim H17.
   clear H17.
     intros.
     decompose [and] H2.
     clear H2.
     unfold betweenf in H17.
     unfold MF.between in H17.
     elim (H17 H10 H11).
     intros i1 Hi.
     elim Hi.
     intros j1 Hj.
     decompose [and] Hj.
     clear Hj Hi H17.
     unfold betweenf in H18.
     unfold MF.between in H18.
     elim (H18 H10 H11).
     intros i2 Hi.
     elim Hi.
     intros j2 Hj.
     decompose [and] Hj.
     clear Hj Hi H18.
     set (p := MF.Iter_upb m x') in |- ×.
     fold p in H25.
     fold p in H22.
     assert (betweenf m y_0_1 x' x0).
    unfold betweenf in |- ×.
      unfold MF.between in |- ×.
      intros.
      assert (S j1 p).
     intro.
       assert (Iter (MF.f m) (S j1) x' = x').
      assert (MF.f = cF).
        tauto.
      rewrite H26 in |- ×.
        unfold p in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
        tauto.
       tauto.
       tauto.
     simpl in H27.
       rewrite H20 in H27.
       unfold y'0 in H27.
       rewrite <- H5 in H27.
       assert (MF.f m (cA m zero y_0) = cF m (cA m zero y_0)).
       tauto.
     rewrite H27 in H28.
       unfold cF in H28.
       rewrite cA_1_cA in H28.
      rewrite H5 in H28.
        simpl in H9.
        unfold prec_L in H9.
        rewrite H28 in H9.
        rewrite cA_cA_1 in H9.
        tauto.
       tauto.
       tauto.
      tauto.
     generalize (exd_cA_1 m zero y).
       unfold y_0 in |- ×.
        tauto.
    assert (expf m x' y_0_1).
     assert (y'0 = y).
      unfold y'0 in |- ×.
        rewrite <- H5 in |- ×.
        unfold y_0 in |- ×.
        rewrite cA_cA_1 in |- ×.
        tauto.
       tauto.
       tauto.
     assert (expf m y y_0_1).
      unfold expf in |- ×.
        split.
        tauto.
      unfold MF.expo in |- ×.
        split.
        tauto.
      split with 1.
        simpl in |- ×.
        assert (MF.f m y = cF m y).
        tauto.
      rewrite H28 in |- ×.
        unfold y_0_1 in |- ×.
        unfold y_0 in |- ×.
        fold (cF m y) in |- ×.
         tauto.
     apply expf_trans with y'0.
       tauto.
     rewrite H27 in |- ×.
        tauto.
    assert (p = MF.Iter_upb m y_0_1).
     unfold p in |- ×.
       apply MF.period_expo.
       tauto.
     unfold expf in H27.
        tauto.
    rewrite <- H28 in |- ×.
      assert (i1 0).
     intro.
       rewrite H29 in H2.
       simpl in H2.
       unfold x'1 in b.
       rewrite H2 in b.
       unfold x_1 in |- ×.
       unfold x_1 in b.
       rewrite cA_cA_1 in b.
       tauto.
      tauto.
      tauto.
    split with (p - (j1 + 1)).
      split with (p - (j1 + 1) + (i1 - 1)).
      split.
     assert (y_0_1 = cF m y).
      unfold y_0_1 in |- ×.
        unfold cF in |- ×.
        fold y_0 in |- ×.
         tauto.
     assert (cF m y = Iter (cF m) 1 y).
      simpl in |- ×.
         tauto.
     rewrite H30 in |- ×.
       rewrite H31 in |- ×.
       assert (cF = MF.f).
       tauto.
     rewrite <- H32 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       assert (y'0 = y).
      unfold y'0 in |- ×.
        rewrite <- H5 in |- ×.
        unfold y_0 in |- ×.
        rewrite cA_cA_1 in |- ×.
        tauto.
       tauto.
       tauto.
     rewrite <- H33 in |- ×.
       rewrite <- H20 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       assert (p - (j1 + 1) + 1 + j1 = p). clear H16.
       omega.
     rewrite H34 in |- ×.
       unfold p in |- ×.
       rewrite MF.Iter_upb_period in |- ×.
       tauto.
      tauto.
      tauto.
    split.
     assert (y'0 = y).
      unfold y'0 in |- ×.
        rewrite <- H5 in |- ×.
        unfold y_0 in |- ×.
        rewrite cA_cA_1 in |- ×.
        tauto.
       tauto.
       tauto.
     assert (y_0_1 = cF m y).
      unfold y_0_1 in |- ×.
        unfold cF in |- ×.
        fold y_0 in |- ×.
         tauto.
     assert (cF m y = Iter (cF m) 1 y).
      simpl in |- ×.
         tauto.
     rewrite H31 in |- ×.
       assert (cF = MF.f).
       tauto.
     rewrite H32 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       rewrite <- H30 in |- ×.
       rewrite <- H20 in |- ×.
       rewrite <- MF.Iter_comp in |- ×.
       assert (p - (j1 + 1) + (i1 - 1) + 1 + j1 = p + (i1 - 1)).
 clear H16.
       omega.
     rewrite H34 in |- ×.
       clear H34.
       assert (x0 = Iter (MF.f m) (i1 - 1) x').
      rewrite <- MF.Iter_f_f_1 in |- ×.
       simpl in |- ×.
         rewrite H2 in |- ×.
         assert (MF.f_1 m x_1 = cF_1 m x_1).
         tauto.
       rewrite H34 in |- ×.
         unfold x_1 in |- ×.
         unfold cF_1 in |- ×.
         rewrite cA_cA_1 in |- ×.
        fold x0 in |- ×.
           tauto.
        tauto.
        tauto.
       tauto.
       tauto. clear H16.
       omega.
     rewrite plus_comm in |- ×.
       rewrite MF.Iter_comp in |- ×.
       unfold p in |- ×.
       rewrite MF.Iter_upb_period in |- ×.
      symmetry in |- ×.
         tauto.
      tauto.
      tauto. clear H16.
     omega.
   assert (expf m y_0_1 x0).
    assert (expf m y y_0_1).
     unfold expf in |- ×.
       split.
       tauto.
     unfold MF.expo in |- ×.
       split.
       tauto.
     split with 1.
       simpl in |- ×.
       unfold y_0_1 in |- ×.
       unfold y_0 in |- ×.
       fold (cF m y) in |- ×.
        tauto.
    assert (expf m x0 x_1).
     unfold expf in |- ×.
       split.
       tauto.
     unfold MF.expo in |- ×.
       split.
      unfold x0 in |- ×.
        generalize (exd_cA m zero x).
         tauto.
     split with 1.
       simpl in |- ×.
       unfold x_1 in |- ×.
       assert (MF.f m x0 = cF m x0).
       tauto.
     rewrite H26 in |- ×.
       unfold cF in |- ×.
       unfold x0 in |- ×.
       rewrite cA_1_cA in |- ×.
       tauto.
      tauto.
      tauto.
    apply expf_trans with y.
     apply expf_symm.
        tauto.
    apply expf_trans with x_1.
     apply expf_symm.
        tauto.
    apply expf_symm.
       tauto.
   assert (betweenf m y_0_1 x0 x0).
    generalize (MF.between_expo_refl_2 m y_0_1 x0).
      assert (exd m y_0_1).
     unfold expf in H24.
       unfold MF.expo in H24.
        tauto.
    assert (MF.expo1 m y_0_1 x0).
     generalize (MF.expo_expo1 m y_0_1 x0).
       unfold expf in H24.
        tauto.
     tauto.
    tauto.
  intro.
    clear H17.
    elim H2.
   clear H2.
     intro.
     decompose [and] H2.
     clear H2.
     assert (y'0 = y).
    unfold y'0 in |- ×.
      rewrite <- H5 in |- ×.
      unfold y_0 in |- ×.
      rewrite cA_cA_1 in |- ×.
      tauto.
     tauto.
     tauto.
   assert (y_0_1 = cF m y).
    unfold y_0_1 in |- ×.
      unfold cF in |- ×.
      fold y_0 in |- ×.
       tauto.
   assert (cF m y = Iter (cF m) 1 y).
    simpl in |- ×.
       tauto.
   assert (y'_1 = y_0_1).
    unfold y_0_1 in |- ×.
      rewrite H5 in |- ×.
      fold y'_1 in |- ×.
       tauto.
   assert (exd m y'_1).
    unfold y'_1 in |- ×.
      generalize (exd_cA_1 m one y').
       tauto.
   assert (y x'10).
    intro.
      unfold y_0 in H5.
      assert (x'1 = y').
     rewrite <- H5 in |- ×.
       rewrite H23 in |- ×.
       unfold x'10 in |- ×.
       rewrite cA_1_cA in |- ×.
       tauto.
      tauto.
     unfold x'1 in |- ×.
       generalize (exd_cA m one x').
        tauto.
    unfold x'1 in |- ×.
      simpl in H9.
      unfold prec_L in H9.
      unfold x'1 in H24.
       tauto.
   unfold betweenf in H18.
     unfold MF.between in H18.
     elim (H18 H10 H22).
     intros i Hi.
     elim Hi.
     intros j Hj.
     decompose [and] Hj.
     clear Hj Hi H18.
     set (p := MF.Iter_upb m y'_1) in |- ×.
     assert (i j).
    intro.
      rewrite H18 in H24.
      rewrite H24 in H26.
       tauto.
   assert (Iter (MF.f m) (p - 1) y'_1 = y).
    rewrite H21 in |- ×.
      rewrite H19 in |- ×.
      rewrite H20 in |- ×.
      rewrite <- MF.Iter_comp in |- ×.
      assert (p - 1 + 1 = p).
     fold p in H28. clear H16.
        omega.
    rewrite H27 in |- ×.
      rewrite <- H24 in |- ×.
      rewrite <- MF.Iter_comp in |- ×.
      rewrite plus_comm in |- ×.
      rewrite MF.Iter_comp in |- ×.
      unfold p in |- ×.
      rewrite MF.Iter_upb_period in |- ×.
      tauto.
     tauto.
    unfold y'_1 in |- ×.
      generalize (exd_cA_1 m one y').
       tauto.
   fold p in H28.
     assert (i = p - 1).
    apply (MF.unicity_mod_p m y'_1 i (p - 1)).
      tauto.
     tauto.
    fold p in |- ×. clear H16.
       omega.
    fold p in |- ×. clear H16.
       omega.
    rewrite H27 in |- ×.
       tauto.
    absurd (i = p - 1). clear H16.
     omega.
    tauto.
  clear H2.
    intro.
    assert (y'0 = y).
   unfold y'0 in |- ×.
     rewrite <- H5 in |- ×.
     unfold y_0 in |- ×.
     rewrite cA_cA_1 in |- ×.
     tauto.
    tauto.
    tauto.
   absurd (expf m x' x_1).
    tauto.
  apply expf_trans with y'0.
    tauto.
  rewrite H17 in |- ×.
    apply expf_symm.
     tauto.
  tauto.
 tauto.
Qed.


Open Scope nat_scope.

Lemma nf_L0L1_IIC: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     expf m x' y'0
       ¬ expf (L m zero x y) x' y'0b
           expf (L m one x' y') x_1b y
       x y' y_0 y'
     False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (y'0b = y'0).
 unfold y'0b in |- ×.
   simpl in |- ×.
   elim (eq_dart_dec x y').
   tauto.
 elim (eq_dart_dec (cA_1 m zero y) y').
   tauto.
  tauto.
assert (x_1b = cA_1 (L m one x' y') one x).
 fold x_1b in |- ×.
    tauto.
generalize H8.
  clear H8.
  simpl in |- ×.
  elim (eq_dart_dec y' x).
 intro.
   symmetry in a.
    tauto.
fold x'1 in |- ×.
  elim (eq_dart_dec x'1 x).
 set (y'_1 := cA_1 m one y') in |- ×.
   intros.
   rewrite H7 in H2.
   rewrite H8 in H3.
   assert (inv_hmap (L m one x' y')).
  simpl in |- ×.
    unfold m2 in H6.
    simpl in H6.
     tauto.
 assert (inv_hmap m).
  simpl in H9.
     tauto.
 assert (exd m x').
  simpl in H9; unfold prec_L in H9.
     tauto.
 assert (exd m x).
  unfold m1 in H.
    simpl in H.
    unfold prec_L in H.
     tauto.
 assert (exd m y).
  unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
 assert (exd m y').
  unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
 assert (exd m y'_1).
  generalize (exd_cA_1 m one y').
    unfold y'_1 in |- ×.
     tauto.
 generalize (expf_L1_CNS m x' y' y'_1 y H9 H15).
   simpl in |- ×.
   fold y'0 in |- ×.
   fold x'1 in |- ×.
   set (x'10 := cA m zero x'1) in |- ×.
   fold y'_1 in |- ×.
   elim (expf_dec m x' y'0).
  intros.
    clear a0.
    assert
     (betweenf m x' y'_1 y'0 betweenf m x' y y'0
      betweenf m y'_1 y'_1 x'10 betweenf m y'_1 y x'10
      ¬ expf m x' y'_1 expf m y'_1 y).
    tauto.
  clear H16.
    clear H3.
    elim H2.
    assert (inv_hmap (L m zero x y)).
   simpl in |- ×.
     unfold m1 in H.
     simpl in H.
      tauto.
  assert (exd m y'0).
   unfold y'0 in |- ×.
     generalize (exd_cA m zero y').
      tauto.
  clear H2.
    generalize (expf_L0_CNS m x y x' y'0 H3 H11).
    simpl in |- ×.
    fold x_1 in |- ×.
    fold y_0 in |- ×.
    fold x0 in |- ×.
    set (y_0_1 := cA_1 m one y_0) in |- ×.
    elim (expf_dec m x_1 y).
   intro.
     clear a0.
     intro.
     elim (eq_dart_dec x' y'0).
    intro.
      rewrite <- a0 in |- ×.
      apply expf_refl.
      tauto.
    simpl in |- ×.
       tauto.
   intro.
     elim H17.
    intro.
      decompose [and] H18.
      clear H18 H17.
      unfold betweenf in H19.
      unfold MF.between in H19.
      elim H19.
     intros i Hi.
       elim Hi.
       intros j Hj.
       decompose [and] Hj.
       clear Hj Hi H19.
       set (p := MF.Iter_upb m x') in |- ×.
       assert (i 0).
      intro.
        rewrite H19 in H17.
        simpl in H17.
        unfold x'1 in a.
        rewrite H17 in a.
        unfold y'_1 in a.
        rewrite cA_cA_1 in a.
       symmetry in a.
          tauto.
       tauto.
       tauto.
     assert (y'_1 = cF m y'0).
      unfold y'0 in |- ×.
        unfold cF in |- *; rewrite cA_1_cA in |- ×.
       fold y'_1 in |- ×.
          tauto.
       tauto.
       tauto.
     assert (Iter (MF.f m) (p - 1) y'_1 = y'0).
      assert (Iter (MF.f m) 1 y'0 = cF m y'0).
       simpl in |- ×.
          tauto.
      rewrite H22 in |- ×.
        rewrite <- H24 in |- ×.
        rewrite <- MF.Iter_comp in |- ×.
        assert (p - 1 + 1 = p).
       fold p in H23. clear H2.
          omega.
      rewrite H25 in |- ×.
        rewrite <- H21 in |- ×.
        rewrite <- MF.Iter_comp in |- ×.
        rewrite plus_comm in |- ×.
        rewrite MF.Iter_comp in |- ×.
        unfold p in |- ×.
        rewrite MF.Iter_upb_period in |- ×.
        tauto.
       tauto.
       tauto.
     assert (Iter (MF.f m) (j - i) y'_1 = y'0).
      rewrite <- MF.Iter_f_f_1 in |- ×.
       rewrite <- H17 in |- ×.
         rewrite <- MF.Iter_comp in |- ×.
         rewrite MF.Iter_f_f_1 in |- ×.
        assert (j + i - i = j). clear H2.
          omega.
        rewrite H25 in |- ×.
          clear H25.
           tauto.
        tauto.
        tauto. clear H2.
        omega.
       tauto.
       tauto. clear H2.
       omega.
     assert (p = MF.Iter_upb m y'_1).
      unfold p in |- ×.
        rewrite <- H17 in |- ×.
        apply MF.period_uniform.
        tauto.
       tauto.
     fold p in H23.
       assert (p - 1 = j - i).
      apply (MF.unicity_mod_p m y'_1).
        tauto.
      unfold y'_1 in |- ×.
        generalize (exd_cA_1 m one y').
         tauto.
      rewrite <- H26 in |- ×. clear H2.
         omega.
      rewrite <- H26 in |- ×. clear H2.
         omega.
      rewrite H25 in |- ×.
         tauto.
      absurd (p - 1 = j - i). clear H2.
       omega.
      tauto.
     tauto.
     tauto.
   intro.
     elim H18; intro.
    decompose [and] H19.
      clear H19 H18 H17.
      unfold betweenf in H21.
      unfold MF.between in H21.
      elim H21.
     intros i Hi.
       elim Hi.
       intros j Hj.
       decompose [and] Hj.
       clear Hj Hi H21.
       set (p := MF.Iter_upb m y'_1) in |- ×.
       fold p in H23.
       assert (x0 y'0).
      intro.
        assert (x = cA_1 m zero y'0).
       rewrite <- H21 in |- ×.
         unfold x0 in |- ×.
         rewrite cA_1_cA in |- ×.
         tauto.
        tauto.
        tauto.
      rewrite H22 in H4.
        unfold y'0 in H4.
        rewrite cA_1_cA in H4.
        tauto.
       tauto.
       tauto.
     assert (x'10 = x0).
      unfold x'10 in |- ×.
        rewrite a in |- ×.
        fold x0 in |- ×.
         tauto.
     assert (x' = x_1).
      unfold x_1 in |- ×.
        rewrite <- a in |- ×.
        unfold x'1 in |- ×.
        rewrite cA_1_cA in |- ×.
        tauto.
       tauto.
       tauto.
     assert (y'_1 = cF m y'0).
      unfold y'0 in |- ×.
        unfold cF in |- ×.
        rewrite cA_1_cA in |- ×.
       fold y'_1 in |- ×.
          tauto.
       tauto.
       tauto.
     assert (Iter (cF m) 1 y'0 = y'_1).
      simpl in |- ×.
        symmetry in |- ×.
         tauto.
     assert (Iter (MF.f m) (p - 1) y'_1 = y'0).
      rewrite <- MF.Iter_f_f_1 in |- ×.
       unfold p in |- ×.
         rewrite MF.Iter_upb_period in |- ×.
        simpl in |- ×.
          rewrite H25 in |- ×.
          assert (MF.f_1 = cF_1).
          tauto.
        rewrite H27 in |- ×.
          rewrite cF_1_cF in |- ×.
          tauto.
         tauto.
         tauto.
        tauto.
        tauto.
       tauto.
       tauto. clear H2.
       omega.
     assert (j p - 1).
      intro.
        rewrite H28 in H19.
        rewrite H19 in H27.
        rewrite H22 in H27.
         tauto.
     assert (x_1 = Iter (cF m) 1 x0).
      simpl in |- ×.
        unfold x0 in |- ×.
        unfold cF in |- ×.
        rewrite cA_1_cA in |- ×.
       fold x_1 in |- ×.
          tauto.
       tauto.
       tauto.
     assert (Iter (MF.f m) (S j) y'_1 = x_1).
      simpl in |- ×.
        rewrite H19 in |- ×.
        rewrite H22 in |- ×.
        rewrite H29 in |- ×.
        simpl in |- ×.
         tauto.
     assert (S j p - 1).
      intro.
        rewrite H31 in H30.
        rewrite <- H24 in H30.
        rewrite H30 in H27.
         tauto.
     assert (p = MF.Iter_upb m x_1).
      unfold p in |- ×.
        rewrite <- H30 in |- ×.
        apply MF.period_uniform.
        tauto.
       tauto.
     assert (betweenf m x_1 y'0 y).
      unfold betweenf in |- ×.
        unfold MF.between in |- ×.
        intros.
        clear H33.
        split with (p - 1 - (j + 1)).
        split with (p - (j + 1) + i).
        rewrite <- H32 in |- ×.
        split.
       rewrite <- H30 in |- ×.
         rewrite <- MF.Iter_comp in |- ×.
         assert (p - 1 - (j + 1) + S j = p - 1). clear H2.
         omega.
       rewrite H33 in |- ×.
          tauto.
      split.
       rewrite <- H30 in |- ×.
         rewrite <- MF.Iter_comp in |- ×.
         assert (p - (j + 1) + i + S j = p + i). clear H2.
         omega.
       rewrite H33 in |- ×.
         rewrite plus_comm in |- ×.
         rewrite MF.Iter_comp in |- ×.
         unfold p in |- ×.
         rewrite MF.Iter_upb_period in |- ×.
         tauto.
        tauto.
        tauto. clear H2.
       omega.
     assert (betweenf m x_1 x' y).
      rewrite H24 in |- ×.
        unfold betweenf in |- ×.
        assert (MF.expo1 m x_1 y).
       generalize (MF.expo_expo1 m x_1 y).
         unfold expf in H0.
          tauto.
      assert (exd m x_1).
       unfold x_1 in |- ×.
         generalize (exd_cA_1 m one x).
          tauto.
      generalize (MF.between_expo_refl_1 m x_1 y).
         tauto.
      tauto.
     tauto.
     tauto.
   clear H18 H17.
     assert (expf m y'0 y'_1).
    unfold expf in |- ×.
      split.
      tauto.
    unfold MF.expo in |- ×.
      split.
      tauto.
    split with 1.
      simpl in |- ×.
      assert (MF.f m y'0 = cF m y'0).
      tauto.
    rewrite H17 in |- ×.
      unfold cF in |- ×.
      unfold y'0 in |- ×.
      rewrite cA_1_cA in |- ×.
     fold y'_1 in |- ×.
        tauto.
     tauto.
     tauto.
    absurd (expf m x' y'_1).
     tauto.
   apply expf_trans with y'0.
     tauto.
    tauto.
   tauto.
  tauto.
intros.
  fold x_1 in H8.
  rewrite H8 in H3.
  rewrite H7 in H2.
  assert (inv_hmap m).
 unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
assert (exd m x).
 unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
assert (exd m y).
 unfold m1 in H; simpl in H; unfold prec_L in H; tauto.
assert (inv_hmap (L m zero x y)).
 simpl in |- ×.
   unfold m1 in H; simpl in H.
    tauto.
assert (exd m x').
 unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
assert (exd m y').
 unfold m2 in H6; simpl in H6; unfold prec_L in H6; tauto.
assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold m2 in H6; simpl in H6.
    tauto.
assert (exd m x_1).
 unfold x_1 in |- ×.
   generalize (exd_cA_1 m one x).
    tauto.
generalize (expf_L1_CNS m x' y' x_1 y H15 H16).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
 intros.
   clear a.
   assert
    (betweenf m x' x_1 y'0 betweenf m x' y y'0
     betweenf m y'_1 x_1 x'10 betweenf m y'_1 y x'10
     ¬ expf m x' x_1 expf m x_1 y).
   tauto.
 clear H17.
   clear H3.
   elim H2.
   generalize (expf_L0_CNS m x y x' y'0 H12 H13).
   simpl in |- ×.
   fold x_1 in |- ×.
   fold y_0 in |- ×.
   fold x0 in |- ×.
   set (y_0_1 := cA_1 m one y_0) in |- ×.
   elim (expf_dec m x_1 y).
  intro.
    clear a.
    intro.
    assert (y_0_1 = cF m y).
   unfold cF in |- ×.
     unfold y_0_1 in |- ×.
     unfold y_0 in |- ×.
      tauto.
  assert (x0 = cF_1 m x_1).
   unfold cF_1 in |- ×.
     unfold x_1 in |- ×.
     rewrite cA_cA_1 in |- ×.
    fold x0 in |- ×.
       tauto.
    tauto.
    tauto.
  assert (x_1 x').
   intro.
     unfold x'1 in b.
     rewrite <- H20 in b.
     unfold x_1 in b.
     rewrite cA_cA_1 in b.
     tauto.
    tauto.
    tauto.
  assert (y y'0).
   intro.
     unfold y_0 in H5.
     rewrite H21 in H5.
     unfold y'0 in H5.
     rewrite cA_1_cA in H5.
     tauto.
    tauto.
    tauto.
  elim H18.
   clear H18.
     intro.
     generalize (betweenf1 m x_1 y x' y'0 H9 H13 H20 H21).
     rewrite <- H17 in |- ×.
     rewrite <- H19 in |- ×.
      tauto.
  intro.
    elim H22.
   intro.
     clear H22 H18.
     assert (exd m y'0).
    unfold y'0 in |- ×.
      generalize (exd_cA m zero y').
       tauto.
   generalize (betweenf2 m x_1 y x' y'0 H9 H18 H20 H21).
     rewrite <- H17 in |- ×.
     rewrite <- H19 in |- ×.
     assert (y'_1 = cF m y'0).
    unfold cF in |- ×.
      unfold y'0 in |- ×.
      rewrite cA_1_cA in |- ×.
     fold y'_1 in |- ×.
        tauto.
     tauto.
     tauto.
   assert (x'10 = cF_1 m x').
    unfold cF_1 in |- ×.
      fold x'10 in |- ×.
      unfold x'10 in |- ×.
      unfold x'1 in |- ×.
       tauto.
   rewrite <- H22 in |- ×.
     rewrite <- H24 in |- ×.
      tauto.
  intro.
    clear H22 H18.
    decompose [and] H23.
    clear H23.
    assert (¬ expf m x_1 x').
   intro.
     elim H18.
     apply expf_symm.
      tauto.
   tauto.
  tauto.
 tauto.
Qed.


Lemma nf_L0L1_II: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     expf m x' y'0
       ¬ expf (L m zero x y) x' y'0b
           expf (L m one x' y') x_1b y
     False.
Proof.
intros.
elim (eq_dart_dec x y').
 intro.
   apply (nf_L0L1_IIA m x y x' y' H H0 H1 H2 H3 a).
elim (eq_dart_dec y_0 y').
 intros.
   apply (nf_L0L1_IIB m x y x' y' H H0 H1 H2 H3 b a).
intros.
  apply (nf_L0L1_IIC m x y x' y' H H0 H1 H2 H3 b0 b).
Qed.

Lemma nf_L0L1_IIIA: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     ¬ expf m x' y'0
        expf (L m one x' y') x_1b y
          expf (L m zero x y) x' y'0b
       x = y'
     False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (inv_hmap m1).
  tauto.
unfold m1 in H6.
  simpl in H6.
  unfold prec_L in H6.
  assert (exd m x).
  tauto.
assert (exd m y).
  tauto.
assert (inv_hmap m).
  tauto.
assert (inv_hmap (L m zero x y)).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m y'0b).
 unfold y'0b in |- ×.
   generalize (exd_cA (L m zero x y) zero y').
    tauto.
assert (inv_hmap m2).
  tauto.
unfold m2 in H12.
  simpl in H12.
  unfold prec_L in H12.
  assert (exd m x').
  tauto.
assert (exd m y').
  tauto.
assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m x_1b).
 unfold x_1b in |- ×.
   generalize (exd_cA_1 (L m one x' y') one x).
    tauto.
clear H6 H12.
  generalize (expf_L1_CNS m x' y' x_1b y H15 H16).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
  tauto.
intros.
  clear b.
  assert
   (expf m x_1b y
    expf m x_1b x' expf m y y'0 expf m y x' expf m x_1b y'0).
  tauto.
clear H6.
  generalize (expf_L0_CNS m x y x' y'0b H10 H13).
  simpl in |- ×.
  fold x_1 in |- ×.
  fold y_0 in |- ×.
  fold x0 in |- ×.
  set (y_0_1 := cA_1 m one y_0) in |- ×.
  elim (expf_dec m x_1 y).
 intros.
   clear a.
   assert
    (betweenf m x_1 x' y betweenf m x_1 y'0b y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0b x0
     ¬ expf m x_1 x' expf m x' y'0b).
   tauto.
 clear H6.
   elim H1.
   clear H1.
   assert (x_1b = x').
  unfold x_1b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec y' x).
    tauto.
  intro.
    symmetry in H4.
     tauto.
 assert (y'0b = y).
  unfold y'0b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec x y').
    tauto.
   tauto.
 rewrite H1 in H12.
   rewrite H1 in H2.
   rewrite H6 in H17.
   rewrite H6 in H3.
   assert (MF.f = cF).
   tauto.
 assert (expf m x0 x_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
   unfold x0 in |- ×.
     generalize (exd_cA m zero x).
      tauto.
  split with 1.
    simpl in |- ×.
    rewrite H18 in |- ×.
    unfold x0 in |- ×.
    unfold cF in |- ×.
    rewrite cA_1_cA in |- ×.
   fold x_1 in |- ×.
      tauto.
   tauto.
   tauto.
 assert (expf m y y_0_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
    tauto.
  split with 1.
    simpl in |- ×.
    rewrite H18 in |- ×.
    unfold y_0_1 in |- ×.
    unfold y_0 in |- ×.
    fold (cF m y) in |- ×.
     tauto.
 assert (x0 = y'0).
  unfold y'0 in |- ×.
    rewrite <- H4 in |- ×.
    fold x0 in |- ×.
     tauto.
 rewrite <- H21 in |- ×.
   rewrite <- H21 in H12.
   assert (exd m x_1).
  unfold x_1 in |- ×.
    generalize (exd_cA_1 m one x).
     tauto.
 assert (exd m y_0).
  unfold y_0 in |- ×.
    generalize (exd_cA_1 m zero y).
     tauto.
 assert (exd m y_0_1).
  unfold y_0_1 in |- ×.
    generalize (exd_cA_1 m one y_0).
     tauto.
 elim H12.
  clear H12.
    intro.
    elim H17.
   clear H17.
     intro.
     assert (expf m x_1 x').
    generalize (betweenf_expf m x_1 x' y).
       tauto.
   apply expf_trans with x_1.
    apply expf_symm.
       tauto.
   apply expf_symm.
      tauto.
  intro.
    clear H17.
    elim H25.
   clear H25.
     intro.
     generalize (betweenf_expf m y_0_1 x' x0).
     intro.
     apply expf_trans with y_0_1.
    apply expf_symm.
       tauto.
    tauto.
  clear H25.
    intro.
     absurd (expf m x_1 x').
    tauto.
  apply expf_symm.
    apply expf_trans with y.
    tauto.
  apply expf_symm.
     tauto.
 clear H12.
   intro.
   elim H12.
  clear H12.
    intro.
    elim H17.
   clear H17.
     intro.
     generalize (betweenf_expf m x_1 x' y).
     intro.
     apply expf_trans with x_1.
    apply expf_symm.
       tauto.
   apply expf_symm.
      tauto.
  clear H17.
    intro.
    elim H17.
   clear H17.
     intro.
     generalize (betweenf_expf m y_0_1 x' x0).
     intro.
     apply expf_trans with y_0_1.
    apply expf_symm.
       tauto.
    tauto.
  clear H17.
    intro.
     absurd (expf m x_1 x').
    tauto.
  apply expf_trans with x0.
   apply expf_symm.
      tauto.
  apply expf_trans with y.
   apply expf_symm; tauto.
  apply expf_symm; tauto.
 clear H12.
    tauto.
 tauto.
Qed.


Lemma nf_L0L1_IIIB: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     ¬ expf m x' y'0
        expf (L m one x' y') x_1b y
          expf (L m zero x y) x' y'0b
       x y' y_0 = y'
     False.
Proof.
intros.
rename H5 into Eqy.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (inv_hmap m1).
  tauto.
unfold m1 in H6.
  simpl in H6.
  unfold prec_L in H6.
  assert (exd m x).
  tauto.
assert (exd m y).
  tauto.
assert (inv_hmap m).
  tauto.
assert (inv_hmap (L m zero x y)).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m y'0b).
 unfold y'0b in |- ×.
   generalize (exd_cA (L m zero x y) zero y').
    tauto.
assert (inv_hmap m2).
  tauto.
unfold m2 in H12.
  simpl in H12.
  unfold prec_L in H12.
  assert (exd m x').
  tauto.
assert (exd m y').
  tauto.
assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m x_1b).
 unfold x_1b in |- ×.
   generalize (exd_cA_1 (L m one x' y') one x).
    tauto.
clear H6 H12.
  generalize (expf_L1_CNS m x' y' x_1b y H15 H16).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
  tauto.
intros.
  clear b.
  assert
   (expf m x_1b y
    expf m x_1b x' expf m y y'0 expf m y x' expf m x_1b y'0).
  tauto.
clear H6.
  generalize (expf_L0_CNS m x y x' y'0b H10 H13).
  simpl in |- ×.
  fold x_1 in |- ×.
  fold y_0 in |- ×.
  fold x0 in |- ×.
  set (y_0_1 := cA_1 m one y_0) in |- ×.
  elim (expf_dec m x_1 y).
 intros.
   clear a.
   assert
    (betweenf m x_1 x' y betweenf m x_1 y'0b y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0b x0
     ¬ expf m x_1 x' expf m x' y'0b).
   tauto.
 clear H6.
   elim H1.
   clear H1.
   assert (y'0b = x0).
  unfold y'0b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec x y').
    tauto.
  fold y_0 in |- ×.
    elim (eq_dart_dec y_0 y').
   fold x0 in |- ×.
      tauto.
   tauto.
 rewrite H1 in H17.
   rewrite H1 in H3.
   simpl in x_1b.
   elim (eq_dart_dec x'1 x).
  intro.
    assert (x_1b = y'_1).
   unfold x_1b in |- ×.
     elim (eq_dart_dec y' x).
    intro.
      symmetry in a0.
       tauto.
   fold x'1 in |- ×.
     elim (eq_dart_dec x'1 x).
    fold y'_1 in |- ×.
       tauto.
    tauto.
  rewrite H6 in H12.
    rewrite H6 in H2.
    assert (MF.f = cF).
    tauto.
  assert (x' = x_1).
   unfold x_1 in |- ×.
     rewrite <- a in |- ×.
     unfold x'1 in |- ×.
     rewrite cA_1_cA in |- ×.
     tauto.
    tauto.
    tauto.
  assert (y = y'0).
   unfold y'0 in |- ×.
     rewrite <- Eqy in |- ×.
     unfold y_0 in |- ×.
     rewrite cA_cA_1 in |- ×.
     tauto.
    tauto.
    tauto.
  rewrite <- H20 in |- ×.
    rewrite H19 in |- ×.
     tauto.
 intro.
   assert (x_1b = x_1).
  unfold x_1b in |- ×.
    elim (eq_dart_dec y' x).
   intro.
     symmetry in a.
      tauto.
  fold x'1 in |- ×.
    fold x_1 in |- ×.
    elim (eq_dart_dec x'1 x).
    tauto.
   tauto.
 rewrite H6 in H12.
   assert (y = y'0).
  unfold y'0 in |- ×.
    rewrite <- Eqy in |- ×.
    unfold y_0 in |- ×.
    rewrite cA_cA_1 in |- ×.
    tauto.
   tauto.
   tauto.
 rewrite <- H18 in |- ×.
   rewrite <- H18 in H12.
   assert (MF.f = cF).
   tauto.
 assert (expf m y y_0_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
    tauto.
  split with 1.
    simpl in |- ×.
    rewrite H19 in |- ×.
    unfold y_0_1 in |- ×.
    unfold y_0 in |- ×.
    fold (cF m y) in |- ×.
     tauto.
 assert (expf m x0 x_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
   unfold x0 in |- ×.
     generalize (exd_cA m zero x).
      tauto.
  split with 1.
    simpl in |- ×.
    rewrite H19 in |- ×.
    unfold x0 in |- ×.
    unfold cF in |- ×.
    rewrite cA_1_cA in |- ×.
   fold x_1 in |- ×.
      tauto.
   tauto.
   tauto.
 assert (exd m x_1).
  unfold x_1 in |- ×.
    generalize (exd_cA_1 m one x).
     tauto.
 assert (exd m y_0).
  unfold y_0 in |- ×.
    generalize (exd_cA_1 m zero y).
     tauto.
 assert (exd m y_0_1).
  unfold y_0_1 in |- ×.
    generalize (exd_cA_1 m one y_0).
     tauto.
 elim H17.
  clear H17.
    intro.
    generalize (betweenf_expf m x_1 x' y).
    intro.
    apply expf_symm.
    apply expf_trans with x_1.
   apply expf_symm.
      tauto.
   tauto.
 clear H17.
   intro.
   elim H17.
  clear H17.
    intro.
    generalize (betweenf_expf m y_0_1 x' x0).
    intro.
    apply expf_trans with y_0_1.
   apply expf_symm.
      tauto.
  apply expf_trans with x0.
    tauto.
  apply expf_trans with x_1.
    tauto.
   tauto.
 clear H17.
   intro.
    absurd (expf m x_1 x').
   tauto.
 apply expf_trans with x0.
  apply expf_symm.
     tauto.
 apply expf_symm.
    tauto.
 tauto.
Qed.

Lemma nf_L0L1_IIIC: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     ¬ expf m x' y'0
        expf (L m one x' y') x_1b y
          expf (L m zero x y) x' y'0b
       x y' y_0 y'
     False.
Proof.
intros.
rename H5 into Dy.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (inv_hmap m1).
  tauto.
unfold m1 in H6.
  simpl in H6.
  unfold prec_L in H6.
  assert (exd m x).
  tauto.
assert (exd m y).
  tauto.
assert (inv_hmap m).
  tauto.
assert (inv_hmap (L m zero x y)).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m y'0b).
 unfold y'0b in |- ×.
   generalize (exd_cA (L m zero x y) zero y').
    tauto.
assert (inv_hmap m2).
  tauto.
unfold m2 in H12.
  simpl in H12.
  unfold prec_L in H12.
  assert (exd m x').
  tauto.
assert (exd m y').
  tauto.
assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m x_1b).
 unfold x_1b in |- ×.
   generalize (exd_cA_1 (L m one x' y') one x).
    tauto.
clear H6 H12.
  generalize (expf_L1_CNS m x' y' x_1b y H15 H16).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
  tauto.
intros.
  clear b.
  assert
   (expf m x_1b y
    expf m x_1b x' expf m y y'0 expf m y x' expf m x_1b y'0).
  tauto.
clear H6.
  generalize (expf_L0_CNS m x y x' y'0b H10 H13).
  simpl in |- ×.
  fold x_1 in |- ×.
  fold y_0 in |- ×.
  fold x0 in |- ×.
  set (y_0_1 := cA_1 m one y_0) in |- ×.
  elim (expf_dec m x_1 y).
 intros.
   clear a.
   assert
    (betweenf m x_1 x' y betweenf m x_1 y'0b y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0b x0
     ¬ expf m x_1 x' expf m x' y'0b).
   tauto.
 clear H6.
   elim H1.
   clear H1.
   assert (y'0b = y'0).
  unfold y'0b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec x y').
    tauto.
  fold y_0 in |- ×.
    elim (eq_dart_dec y_0 y').
   fold x0 in |- ×.
      tauto.
   tauto.
 rewrite H1 in H17.
   rewrite H1 in H3.
   elim (eq_dart_dec x'1 x).
  intro.
    assert (x_1b = y'_1).
   unfold x_1b in |- ×.
     simpl in |- ×.
     elim (eq_dart_dec y' x).
    intro.
      symmetry in a0.
       tauto.
   fold x'1 in |- ×.
     fold x_1 in |- ×.
     elim (eq_dart_dec x'1 x).
    fold y'_1 in |- ×.
       tauto.
    tauto.
  rewrite H6 in H12.
    rewrite H6 in H2.
    assert (MF.f = cF).
    tauto.
  assert (x' = x_1).
   unfold x_1 in |- ×.
     rewrite <- a in |- ×.
     unfold x'1 in |- ×.
     rewrite cA_1_cA in |- ×.
     tauto.
    tauto.
    tauto.
  rewrite H19 in |- ×.
    rewrite H19 in H12.
    rewrite H19 in H17.
    assert (expf m y y_0_1).
   unfold expf in |- ×.
     split.
     tauto.
   unfold MF.expo in |- ×.
     split.
     tauto.
   split with 1.
     simpl in |- ×.
     rewrite H18 in |- ×.
     unfold y_0_1 in |- ×.
     unfold y_0 in |- ×.
     fold (cF m y) in |- ×.
      tauto.
  assert (expf m x0 x_1).
   unfold expf in |- ×.
     split.
     tauto.
   unfold MF.expo in |- ×.
     split.
    unfold x0 in |- ×.
      generalize (exd_cA m zero x).
       tauto.
   split with 1.
     simpl in |- ×.
     rewrite H18 in |- ×.
     unfold x0 in |- ×.
     unfold cF in |- ×.
     rewrite cA_1_cA in |- ×.
    fold x_1 in |- ×.
       tauto.
    tauto.
    tauto.
  assert (exd m x_1).
   unfold x_1 in |- ×.
     generalize (exd_cA_1 m one x).
      tauto.
  assert (exd m y_0).
   unfold y_0 in |- ×.
     generalize (exd_cA_1 m zero y).
      tauto.
  assert (exd m y_0_1).
   unfold y_0_1 in |- ×.
     generalize (exd_cA_1 m one y_0).
      tauto.
  assert (expf m y'0 y'_1).
   unfold expf in |- ×.
     split.
     tauto.
   unfold MF.expo in |- ×.
     split.
    unfold y'0 in |- ×.
      generalize (exd_cA m zero y').
       tauto.
   split with 1.
     simpl in |- ×.
     rewrite H18 in |- ×.
     unfold y'0 in |- ×.
     unfold cF in |- ×.
     rewrite cA_1_cA in |- ×.
    fold y'_1 in |- ×.
       tauto.
    tauto.
    tauto.
  elim H12.
   clear H12.
     intro.
     apply expf_trans with y.
     tauto.
   apply expf_trans with y'_1.
    apply expf_symm.
       tauto.
   apply expf_symm.
      tauto.
  clear H12.
    intro.
    elim H12.
   clear H12.
     intro.
     apply expf_trans with y.
     tauto.
    tauto.
  clear H12.
    intro.
    elim H17.
   clear H17.
     intro.
     generalize (betweenf_expf m x_1 y'0 y).
     intro.
      tauto.
  clear H17.
    intro.
    elim H17.
   clear H17.
     intro.
     generalize (betweenf_expf m y_0_1 x_1 x0).
     intro.
     generalize (betweenf_expf m y_0_1 y'0 x0).
     intro.
     apply expf_trans with y_0_1.
    apply expf_symm.
       tauto.
    tauto.
  clear H17.
    intro.
     tauto.
 intro.
   assert (x_1b = x_1).
  unfold x_1b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec y' x).
   intro.
     symmetry in a.
      tauto.
  fold x'1 in |- ×.
    fold x_1 in |- ×.
    elim (eq_dart_dec x'1 x).
    tauto.
   tauto.
 rewrite H6 in H12.
   assert (exd m x_1).
  unfold x_1 in |- ×.
    generalize (exd_cA_1 m one x).
     tauto.
 assert (exd m y_0).
  unfold y_0 in |- ×.
    generalize (exd_cA_1 m zero y).
     tauto.
 assert (exd m y_0_1).
  unfold y_0_1 in |- ×.
    generalize (exd_cA_1 m one y_0).
     tauto.
 assert (MF.f = cF).
   tauto.
 assert (expf m y'0 y'_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
   unfold y'0 in |- ×.
     generalize (exd_cA m zero y').
      tauto.
  split with 1.
    simpl in |- ×.
    rewrite H21 in |- ×.
    unfold y'0 in |- ×.
    unfold cF in |- ×.
    rewrite cA_1_cA in |- ×.
   fold y'_1 in |- ×.
      tauto.
   tauto.
   tauto.
 assert (expf m x0 x_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
   unfold x0 in |- ×.
     generalize (exd_cA m zero x).
      tauto.
  split with 1.
    simpl in |- ×.
    rewrite H21 in |- ×.
    unfold x0 in |- ×.
    unfold cF in |- ×.
    rewrite cA_1_cA in |- ×.
   fold x_1 in |- ×.
      tauto.
   tauto.
   tauto.
 assert (expf m y y_0_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
    tauto.
  split with 1.
    simpl in |- ×.
    rewrite H21 in |- ×.
    unfold y_0_1 in |- ×.
    unfold y_0 in |- ×.
    fold (cF m y) in |- ×.
     tauto.
 elim H17.
  clear H17.
    intro.
    generalize (betweenf_expf m x_1 x' y).
    generalize (betweenf_expf m x_1 y'0 y).
    intros.
    apply expf_trans with x_1.
   apply expf_symm.
      tauto.
   tauto.
 clear H17.
   intro.
   elim H17.
  clear H17.
    intro.
    generalize (betweenf_expf m y_0_1 x' x0).
    generalize (betweenf_expf m y_0_1 y'0 x0).
    intros.
    apply expf_trans with y_0_1.
   apply expf_symm.
      tauto.
   tauto.
  tauto.
 tauto.
Qed.

Lemma nf_L0L1_III: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     ¬ expf m x' y'0
        expf (L m one x' y') x_1b y
          expf (L m zero x y) x' y'0b
     False.
Proof.
intros.
elim (eq_dart_dec x y').
 intro.
   apply (nf_L0L1_IIIA m x y x' y' H H0 H1 H2 H3 a).
elim (eq_dart_dec y_0 y').
 intros.
   apply (nf_L0L1_IIIB m x y x' y' H H0 H1 H2 H3 b a).
intros.
  apply (nf_L0L1_IIIC m x y x' y' H H0 H1 H2 H3 b0 b).
Qed.

Open Scope nat_scope.

Lemma nf_L0L1_IVA: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     ¬ expf m x' y'0
        ¬ expf (L m one x' y') x_1b y
            expf (L m zero x y) x' y'0b
       x = y'
     False.
Proof.
intros.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (inv_hmap m1).
  tauto.
unfold m1 in H6.
  simpl in H6.
  unfold prec_L in H6.
  assert (exd m x).
  tauto.
assert (exd m y).
  tauto.
assert (inv_hmap m).
  tauto.
assert (inv_hmap (L m zero x y)).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m y'0b).
 unfold y'0b in |- ×.
   generalize (exd_cA (L m zero x y) zero y').
    tauto.
assert (inv_hmap m2).
  tauto.
unfold m2 in H12.
  simpl in H12.
  unfold prec_L in H12.
  assert (exd m x').
  tauto.
assert (exd m y').
  tauto.
assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m x_1b).
 unfold x_1b in |- ×.
   generalize (exd_cA_1 (L m one x' y') one x).
    tauto.
clear H6 H12.
  generalize (expf_L1_CNS m x' y' x_1b y H15 H16).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
  tauto.
intros.
  clear b.
  assert
   (¬
    (expf m x_1b y
     expf m x_1b x' expf m y y'0 expf m y x' expf m x_1b y'0)).
  tauto.
clear H6.
  generalize (expf_L0_CNS m x y x' y'0b H10 H13).
  simpl in |- ×.
  fold x_1 in |- ×.
  fold y_0 in |- ×.
  fold x0 in |- ×.
  set (y_0_1 := cA_1 m one y_0) in |- ×.
  elim (expf_dec m x_1 y).
 intros.
   assert
    (betweenf m x_1 x' y betweenf m x_1 y'0b y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0b x0
     ¬ expf m x_1 x' expf m x' y'0b).
   tauto.
 clear H6.
   assert (x_1b = x').
  unfold x_1b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec y' x).
    tauto.
  intro.
    symmetry in H4.
     tauto.
 assert (y'0b = y).
  unfold y'0b in |- ×.
    simpl in |- ×.
    elim (eq_dart_dec x y').
    tauto.
   tauto.
 rewrite H6 in H12.
   rewrite H18 in H17.
   assert (MF.f = cF).
   tauto.
 assert (expf m x0 x_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
   unfold x0 in |- ×.
     generalize (exd_cA m zero x).
      tauto.
  split with 1.
    simpl in |- ×.
    rewrite H19 in |- ×.
    unfold x0 in |- ×.
    unfold cF in |- ×.
    rewrite cA_1_cA in |- ×.
   fold x_1 in |- ×.
      tauto.
   tauto.
   tauto.
 assert (expf m y y_0_1).
  unfold expf in |- ×.
    split.
    tauto.
  unfold MF.expo in |- ×.
    split.
    tauto.
  split with 1.
    simpl in |- ×.
    rewrite H19 in |- ×.
    unfold y_0_1 in |- ×.
    unfold y_0 in |- ×.
    fold (cF m y) in |- ×.
     tauto.
 assert (x0 = y'0).
  unfold y'0 in |- ×.
    rewrite <- H4 in |- ×.
    fold x0 in |- ×.
     tauto.
 rewrite <- H22 in H12.
   rewrite <- H22 in H1.
   assert (exd m x_1).
  unfold x_1 in |- ×.
    generalize (exd_cA_1 m one x).
     tauto.
 assert (exd m y_0).
  unfold y_0 in |- ×.
    generalize (exd_cA_1 m zero y).
     tauto.
 assert (exd m y_0_1).
  unfold y_0_1 in |- ×.
    generalize (exd_cA_1 m one y_0).
     tauto.
 elim H12.
   clear H12.
   elim H17.
  clear H17.
    intro.
    generalize (betweenf_expf m x_1 x' y).
    intros.
    left.
    apply expf_trans with x_1.
   apply expf_symm.
      tauto.
   tauto.
 intro.
   elim H12.
  clear H12 H17.
    intro.
    generalize (betweenf_expf m y_0_1 x' x0).
    generalize (betweenf_expf m y_0_1 y x0).
    intros.
    left.
    apply expf_trans with y_0_1.
   apply expf_symm.
      tauto.
   tauto.
 clear H12.
    tauto.
 tauto.
Qed.


Lemma nf_L0L1_IVB: (m:fmap)(x y x' y':dart),
  let m1:=L (L m zero x y) one x' y' in
  let m2:=L (L m one x' y') zero x y in
  inv_hmap m1
  let x_1 := cA_1 m one x in
  let y_0 := cA_1 m zero y in
  let y'0 := cA m zero y' in
  let x'1 := cA m one x' in
  let y'0b := cA (L m zero x y) zero y' in
  let x_1b := cA_1 (L m one x' y') one x in
  expf m x_1 y
     ¬ expf m x' y'0
        ¬ expf (L m one x' y') x_1b y
            expf (L m zero x y) x' y'0b
       x y' y_0 = y'
     False.
Proof.
intros.
rename H5 into Eqy.
assert (inv_hmap m2).
 unfold m2 in |- ×.
   apply inv_hmap_L0L1.
   fold m1 in |- ×.
    tauto.
set (x0 := cA m zero x) in |- ×.
  assert (inv_hmap m1).
  tauto.
unfold m1 in H6.
  simpl in H6.
  unfold prec_L in H6.
  assert (exd m x).
  tauto.
assert (exd m y).
  tauto.
assert (inv_hmap m).
  tauto.
assert (inv_hmap (L m zero x y)).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m y'0b).
 unfold y'0b in |- ×.
   generalize (exd_cA (L m zero x y) zero y').
    tauto.
assert (inv_hmap m2).
  tauto.
unfold m2 in H12.
  simpl in H12.
  unfold prec_L in H12.
  assert (exd m x').
  tauto.
assert (exd m y').
  tauto.
assert (inv_hmap (L m one x' y')).
 simpl in |- ×.
   unfold prec_L in |- ×.
    tauto.
assert (exd m x_1b).
 unfold x_1b in |- ×.
   generalize (exd_cA_1 (L m one x' y') one x).
    tauto.
clear H6 H12.
  generalize (expf_L1_CNS m x' y' x_1b y H15 H16).
  simpl in |- ×.
  fold y'0 in |- ×.
  fold x'1 in |- ×.
  set (x'10 := cA m zero x'1) in |- ×.
  set (y'_1 := cA_1 m one y') in |- ×.
  elim (expf_dec m x' y'0).
  tauto.
intros.
  clear b.
  assert
   (¬
    (expf m x_1b y
     expf m x_1b x' expf m y y'0 expf m y x' expf m x_1b y'0)).
  tauto.
clear H6.
  generalize (expf_L0_CNS m x y x' y'0b H10 H13).
  simpl in |- ×.
  fold x_1 in |- ×.
  fold y_0 in |- ×.
  fold x0 in |- ×.
  set (y_0_1 := cA_1 m one y_0) in |- ×.
  elim (expf_dec m x_1 y).
 intros.
   assert
    (betweenf m x_1 x' y betweenf m x_1 y'0b y
     betweenf m y_0_1 x' x0 betweenf m y_0_1 y'0b x0
     ¬ expf m x_1 x' expf m x' y'0b).
   tauto.
 clear H6.
   assert (y'0b = x0).
  unfold y'0b in |- ×.
    simpl