Library HistoricalExamples.Format





Require Import Base.



 Variable Ind : Spec.
 Definition l_ch :=
    A : Spec, A (bool A A) (Ind A A) A.

 Definition nil : l_ch :=
   fun (A : Spec) (x0 : A) (x1 : bool A A) (x2 : Ind A A) ⇒ x0.
 Definition consbl (b : bool) (l : l_ch) : l_ch :=
   fun (A : Spec) (x0 : A) (x1 : bool A A) (x2 : Ind A A) ⇒
   x1 b (l A x0 x1 x2).
 Definition consltr (i : Ind) (l : l_ch) : l_ch :=
   fun (A : Spec) (x0 : A) (x1 : bool A A) (x2 : Ind A A) ⇒
   x2 i (l A x0 x1 x2).

 Definition conssp := consbl true.
 Definition conslf := consbl false.


 Hypothesis
   LCH_Ind :
      (x : l_ch) (P : l_ch Prop),
     P nil
     ( (b : bool) (l : l_ch), P l P (consbl b l))
     ( (i : Ind) (l : l_ch), P l P (consltr i l)) P x.

 Hypothesis
   LCH_rec :
      (x : l_ch) (P : l_ch Spec),
     P nil
     ( (b : bool) (l : l_ch), P l P (consbl b l))
     ( (i : Ind) (l : l_ch), P l P (consltr i l)) P x.


Section Casebl.

 Variable A : Spec.
 Definition Casebl (c : l_ch) (xnil : A) (xbl xltr : A A) : A :=
   c A xnil (fun b : boolxbl) (fun i : Indxltr).

End Casebl.


 Definition lgth (l : l_ch) : nat := Casebl nat l O S S.


 Definition app (l m : l_ch) : l_ch := l l_ch m consbl consltr.

 Definition appsp (l m : l_ch) := app l (conssp m).

 Definition applf (l m : l_ch) := app l (conslf m).


 Variable max : nat.


 Definition word (l : l_ch) : Prop :=
    P : l_ch Prop,
   P nil ( (i : Ind) (m : l_ch), P m P (consltr i m)) P l.

 Definition wordnil : word nil :=
   fun (P : l_ch Prop) (h1 : P nil)
     (h2 : (i : Ind) (m : l_ch), P m P (consltr i m)) ⇒ h1.

 Definition wordltr (j : Ind) (l : l_ch) (h : word l) :
   word (consltr j l) :=
   fun (P : l_ch Prop) (h1 : P nil)
     (h2 : (i : Ind) (m : l_ch), P m P (consltr i m)) ⇒
   h2 j l (h P h1 h2).

 Definition space (l : l_ch) : Prop :=
    P : l_ch Prop,
   ( b : bool, P (consbl b nil))
   ( (b : bool) (m : l_ch), P m P (consbl b m)) P l.

 Definition space_bl : b : bool, space (consbl b nil) :=
   fun (c : bool) (P : l_ch Prop) (h1 : b : bool, P (consbl b nil))
     (h2 : (b : bool) (m : l_ch), P m P (consbl b m)) ⇒
   h1 c.

 Definition space_co_bl :
    (b : bool) (l : l_ch), space l space (consbl b l) :=
   fun (c : bool) (l : l_ch) (h : space l) (P : l_ch Prop)
     (h1 : b : bool, P (consbl b nil))
     (h2 : (b : bool) (m : l_ch), P m P (consbl b m)) ⇒
   h2 c l (h P h1 h2).



 Variable inf sup : nat Prop.
 Hypothesis ax1 : n : nat, {inf n} + {sup n}.

 Definition inflg (m : l_ch) := inf (lgth m).

 Definition suplg (m : l_ch) := sup (lgth m).

 Definition plus (m : l_ch) (n : nat) : nat := lgth m nat S n.


 Definition valide (l : l_ch) :=
    P : l_ch Spec,
   ( m : l_ch, word m inflg m P m)
   ( m1 m2 p : l_ch,
    word m1 inflg m1 space m2 P p P (app m1 (app m2 p)))
   P l.


 Definition vword : m : l_ch, word m inflg m valide m :=
   fun (x : l_ch) (h1 : word x) (h2 : inflg x) (P : l_ch Spec)
     (t1 : m : l_ch, word m inflg m P m)
     (t2 : m1 m2 p : l_ch,
           word m1 inflg m1 space m2 P p P (app m1 (app m2 p))) ⇒
   t1 x h1 h2.

 Definition vapp :
    m1 m2 p : l_ch,
   word m1 inflg m1 space m2 valide p valide (app m1 (app m2 p)) :=
   fun (x1 x2 m : l_ch) (h1 : word x1) (h2 : inflg x1)
     (h3 : space x2) (h : valide m) (P : l_ch Spec)
     (t1 : l : l_ch, word l inflg l P l)
     (t2 : m1 m2 p : l_ch,
           word m1 inflg m1 space m2 P p P (app m1 (app m2 p))) ⇒
   t2 x1 x2 m h1 h2 h3 (h P t1 t2).



 Hypothesis infmax : inf O.


 Definition NV (x : l_ch) :=
    P : l_ch Prop,
   ( l : l_ch, word l suplg l P l)
   ( l m : l_ch, P l P (app l m))
   ( l m : l_ch, P l P (app m l)) P x.


 Definition NVword : l : l_ch, word l suplg l NV l :=
   fun (x : l_ch) (h1 : word x) (h2 : suplg x) (P : l_ch Prop)
     (t1 : l : l_ch, word l suplg l P l)
     (t2 : l m : l_ch, P l P (app l m))
     (t3 : l m : l_ch, P l P (app m l)) ⇒
   t1 x h1 h2.

 Definition NVapp1 : l m : l_ch, NV l NV (app l m) :=
   fun (x y : l_ch) (h : NV x) (P : l_ch Prop)
     (t1 : l : l_ch, word l suplg l P l)
     (t2 : l m : l_ch, P l P (app l m))
     (t3 : l m : l_ch, P l P (app m l)) ⇒
   t2 x y (h P t1 t2 t3).

 Definition NVapp2 : l m : l_ch, NV l NV (app m l) :=
   fun (x y : l_ch) (h : NV x) (P : l_ch Prop)
     (t1 : l : l_ch, word l suplg l P l)
     (t2 : l m : l_ch, P l P (app l m))
     (t3 : l m : l_ch, P l P (app m l)) ⇒
   t3 x y (h P t1 t2 t3).


 Definition val_or_no (l : l_ch) := valide l + {NV l}.
 Definition inval (l : l_ch) := inleft (valide l) (NV l).
 Definition inNV (l : l_ch) := inright (valide l) (NV l).


 Definition valbl (b : bool) (l : l_ch) (h : valide l) : valide (consbl b l) :=
   vapp nil (consbl b nil) l wordnil infmax (space_bl b) h.


Section Valltr.

Variable i : Ind.
Variable l : l_ch.

 Definition Valltr := valide l & val_or_no (consltr i l).
 Definition Vfst := fst (valide l) (val_or_no (consltr i l)).
 Definition Vsnd := snd (valide l) (val_or_no (consltr i l)).
 Definition Vand := pair (valide l) (val_or_no (consltr i l)).

End Valltr.

 Lemma valltr :
   (i : Ind) (l : l_ch), valide l val_or_no (consltr i l).
 Proof
   fun (i : Ind) (l : l_ch) (h : valide l) ⇒
   Vsnd i l
     (h (Valltr i)
        (fun (m : l_ch) (t1 : word m) (t2 : inflg m) ⇒
         Vand i m (vword m t1 t2)
           (ax1 (S (lgth m)) (val_or_no (consltr i m))
              (fun h1 : inflg (consltr i m) ⇒
               inval (consltr i m) (vword (consltr i m) (wordltr i m t1) h1))
              (fun h2 : suplg (consltr i m) ⇒
               inNV (consltr i m) (NVword (consltr i m) (wordltr i m t1) h2))))
        (fun (m1 m2 p : l_ch) (t1 : word m1) (t2 : inflg m1)
           (t3 : space m2) (f : Valltr i p) ⇒
         Vand i (app m1 (app m2 p)) (vapp m1 m2 p t1 t2 t3 (Vfst i p f))
           (ax1 (S (lgth m1)) (val_or_no (consltr i (app m1 (app m2 p))))
              (fun h11 : inflg (consltr i m1) ⇒
               inval (consltr i (app m1 (app m2 p)))
                 (vapp (consltr i m1) m2 p (wordltr i m1 t1) h11 t3
                    (Vfst i p f)))
              (fun h12 : suplg (consltr i m1) ⇒
               inNV (consltr i (app m1 (app m2 p)))
                 (NVapp1 (consltr i m1) (app m2 p)
                    (NVword (consltr i m1) (wordltr i m1 t1) h12)))))).


 Definition preproc (l : l_ch) : valide l + {NV l} :=
   LCH_rec l val_or_no (inval nil (vword nil wordnil infmax))
     (fun (b : bool) (m : l_ch) (h : val_or_no m) ⇒
      h (val_or_no (consbl b m))
        (fun h1 : valide minval (consbl b m) (valbl b m h1))
        (fun h2 : NV minNV (consbl b m) (NVapp2 m (consbl b nil) h2)))
     (fun (i : Ind) (m : l_ch) (h : val_or_no m) ⇒
      h (val_or_no (consltr i m)) (valltr i m)
        (fun t : NV minNV (consltr i m) (NVapp2 m (consltr i nil) t))).



 Definition Eq (x y : l_ch) :=
    R : l_ch l_ch Prop,
   R nil nil
   ( (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
   ( (b c : bool) (l m : l_ch), R l m R (consbl b l) (consbl c m))
   ( (i : Ind) (l m : l_ch), R l m R (consltr i l) (consltr i m))
   ( (b c : bool) (l m : l_ch),
    R l (consbl b m) R (consbl c l) (consbl b m))
   ( l m n : l_ch, R l m R m n R l n) R x y.

 Definition Eq_nil : Eq nil nil :=
   fun (R : l_ch l_ch Prop) (h0 : R nil nil)
     (h1 : (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
     (h2 : (b c : bool) (l m : l_ch),
           R l m R (consbl b l) (consbl c m))
     (h3 : (i : Ind) (l m : l_ch),
           R l m R (consltr i l) (consltr i m))
     (h4 : (b c : bool) (l m : l_ch),
           R l (consbl b m) R (consbl c l) (consbl b m))
     (h5 : l m n : l_ch, R l m R m n R l n) ⇒ h0.

 Definition Eq_bl_nil :
    (b : bool) (l : l_ch),
   Eq l nil Eq (consbl b l) nil :=
   fun (d : bool) (x : l_ch) (h : Eq x nil)
     (R : l_ch l_ch Prop) (h0 : R nil nil)
     (h1 : (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
     (h2 : (b c : bool) (l m : l_ch),
           R l m R (consbl b l) (consbl c m))
     (h3 : (i : Ind) (l m : l_ch),
           R l m R (consltr i l) (consltr i m))
     (h4 : (b c : bool) (l m : l_ch),
           R l (consbl b m) R (consbl c l) (consbl b m))
     (h5 : l m n : l_ch, R l m R m n R l n) ⇒
   h1 d x (h R h0 h1 h2 h3 h4 h5).

 Definition Eq_co_bl :
    (b c : bool) (l m : l_ch),
   Eq l m Eq (consbl b l) (consbl c m) :=
   fun (d e : bool) (x y : l_ch) (h : Eq x y)
     (R : l_ch l_ch Prop) (h0 : R nil nil)
     (h1 : (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
     (h2 : (b c : bool) (l m : l_ch),
           R l m R (consbl b l) (consbl c m))
     (h3 : (i : Ind) (l m : l_ch),
           R l m R (consltr i l) (consltr i m))
     (h4 : (b c : bool) (l m : l_ch),
           R l (consbl b m) R (consbl c l) (consbl b m))
     (h5 : l m n : l_ch, R l m R m n R l n) ⇒
   h2 d e x y (h R h0 h1 h2 h3 h4 h5).

 Definition Eq_co_ltr :
    (i : Ind) (l m : l_ch),
   Eq l m Eq (consltr i l) (consltr i m) :=
   fun (j : Ind) (x y : l_ch) (h : Eq x y) (R : l_ch l_ch Prop)
     (h0 : R nil nil)
     (h1 : (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
     (h2 : (b c : bool) (l m : l_ch),
           R l m R (consbl b l) (consbl c m))
     (h3 : (i : Ind) (l m : l_ch),
           R l m R (consltr i l) (consltr i m))
     (h4 : (b c : bool) (l m : l_ch),
           R l (consbl b m) R (consbl c l) (consbl b m))
     (h5 : l m n : l_ch, R l m R m n R l n) ⇒
   h3 j x y (h R h0 h1 h2 h3 h4 h5).

 Definition Eq_bl_bl :
    (b c : bool) (l m : l_ch),
   Eq l (consbl b m) Eq (consbl c l) (consbl b m) :=
   fun (d e : bool) (x y : l_ch) (h : Eq x (consbl d y))
     (R : l_ch l_ch Prop) (h0 : R nil nil)
     (h1 : (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
     (h2 : (b c : bool) (l m : l_ch),
           R l m R (consbl b l) (consbl c m))
     (h3 : (i : Ind) (l m : l_ch),
           R l m R (consltr i l) (consltr i m))
     (h4 : (b c : bool) (l m : l_ch),
           R l (consbl b m) R (consbl c l) (consbl b m))
     (h5 : l m n : l_ch, R l m R m n R l n) ⇒
   h4 d e x y (h R h0 h1 h2 h3 h4 h5).

 Definition Eq_tran :
    l m n : l_ch, Eq l m Eq m n Eq l n :=
   fun (x y z : l_ch) (t1 : Eq x y) (t2 : Eq y z)
     (R : l_ch l_ch Prop) (h0 : R nil nil)
     (h1 : (b : bool) (l : l_ch), R l nil R (consbl b l) nil)
     (h2 : (b c : bool) (l m : l_ch),
           R l m R (consbl b l) (consbl c m))
     (h3 : (i : Ind) (l m : l_ch),
           R l m R (consltr i l) (consltr i m))
     (h4 : (b c : bool) (l m : l_ch),
           R l (consbl b m) R (consbl c l) (consbl b m))
     (h5 : l m n : l_ch, R l m R m n R l n) ⇒
   h5 x y z (t1 R h0 h1 h2 h3 h4 h5) (t2 R h0 h1 h2 h3 h4 h5).



 Definition Eq_re (l : l_ch) : Eq l l :=
   LCH_Ind l (fun u : l_chEq u u) Eq_nil
     (fun (b : bool) (m : l_ch) ⇒ Eq_co_bl b b m m)
     (fun (i : Ind) (m : l_ch) ⇒ Eq_co_ltr i m m).