Reasoning Details

 < Module library:list.
 < Prove_Constraint library:host:proj_e_unique.

Subgoal 1:

Variables: E1 E2
Hyp : |{e}- null E1 ~~> E1
Hyp1 : |{e}- null E1 ~~> E2
============================
 E1 = E2
 < case Hyp1.

Subgoal 1:

Variables: E2
Hyp : |{e}- null E2 ~~> E2
============================
 E2 = E2
 < search.

Subgoal 2:

Variables: E1 E2
Hyp : |{e}- head E1 ~~> E1
Hyp1 : |{e}- head E1 ~~> E2
============================
 E1 = E2
 < case Hyp1.

Subgoal 2:

Variables: E2
Hyp : |{e}- head E2 ~~> E2
============================
 E2 = E2
 < search.

Subgoal 3:

Variables: E1 E2
Hyp : |{e}- tail E1 ~~> E1
Hyp1 : |{e}- tail E1 ~~> E2
============================
 E1 = E2
 < case Hyp1.

Subgoal 3:

Variables: E2
Hyp : |{e}- tail E2 ~~> E2
============================
 E2 = E2
 < search.

Subgoal 4:

Variables: E2
Hyp : |{e}- nil ~~> trueE
Hyp1 : |{e}- nil ~~> E2
============================
 trueE = E2
 < case Hyp1.

Subgoal 4:

Hyp : |{e}- nil ~~> trueE
============================
 trueE = trueE
 < search.

Subgoal 5:

Variables: E2 E4 E3
Hyp : |{e}- cons E3 E4 ~~> eq E3 E4
Hyp1 : |{e}- cons E3 E4 ~~> E2
============================
 eq E3 E4 = E2
 < case Hyp1.

Subgoal 5:

Variables: E4 E3
Hyp : |{e}- cons E3 E4 ~~> eq E3 E4
============================
 eq E3 E4 = eq E3 E4
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_e_is.

Subgoal 1:

Variables: E'
Hyp : |{e}- null E' ~~> E'
Hyp1 : is_e (null E')
============================
 is_e E'
 < case Hyp1.

Subgoal 1:

Variables: E'
Hyp : |{e}- null E' ~~> E'
H1 : is_e E'
============================
 is_e E'
 < search.

Subgoal 2:

Variables: E'
Hyp : |{e}- head E' ~~> E'
Hyp1 : is_e (head E')
============================
 is_e E'
 < case Hyp1.

Subgoal 2:

Variables: E'
Hyp : |{e}- head E' ~~> E'
H1 : is_e E'
============================
 is_e E'
 < search.

Subgoal 3:

Variables: E'
Hyp : |{e}- tail E' ~~> E'
Hyp1 : is_e (tail E')
============================
 is_e E'
 < case Hyp1.

Subgoal 3:

Variables: E'
Hyp : |{e}- tail E' ~~> E'
H1 : is_e E'
============================
 is_e E'
 < search.

Subgoal 4:

Hyp : |{e}- nil ~~> trueE
Hyp1 : is_e nil
============================
 is_e trueE
 < case Hyp1.

Subgoal 4:

Hyp : |{e}- nil ~~> trueE
============================
 is_e trueE
 < search.

Subgoal 5:

Variables: E2 E1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp1 : is_e (cons E1 E2)
============================
 is_e (eq E1 E2)
 < case Hyp1.

Subgoal 5:

Variables: E2 E1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
H1 : is_e E1
H2 : is_e E2
============================
 is_e (eq E1 E2)
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_unique.

Variables: S2 Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : |{s}- splitlist Hd Tl E ~~> S2
Hyp2 : Hd = Tl -> false
============================
 seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) = S2
 < case Hyp1.

Variables: Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
H1 : Hd = Tl -> false
============================
 seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) = seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_is.

Variables: Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : is_s (splitlist Hd Tl E)
Hyp2 : Hd = Tl -> false
============================
 is_s (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))))
 < case Hyp1.

Variables: Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
H1 : is_string Hd
H2 : is_string Tl
H3 : is_e E
============================
 is_s (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))))
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_ty_unique.

Variables: Ty1 Ty2
Hyp : |{ty}- list Ty1 ~~> Ty1
Hyp1 : |{ty}- list Ty1 ~~> Ty2
============================
 Ty1 = Ty2
 < case Hyp1.

Variables: Ty2
Hyp : |{ty}- list Ty2 ~~> Ty2
============================
 Ty2 = Ty2
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_ty_is.

Variables: Ty'
Hyp : |{ty}- list Ty' ~~> Ty'
Hyp1 : is_ty (list Ty')
============================
 is_ty Ty'
 < case Hyp1.

Variables: Ty'
Hyp : |{ty}- list Ty' ~~> Ty'
H1 : is_ty Ty'
============================
 is_ty Ty'
 < search.

Proof completed.
 < Add_Proj_Rel library:host:is_e.

Proof completed.
 < Prove_Ext_Ind library:host:is_e.

Warning:  No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 9:

IH : forall E, is_e E * -> <is_e {P}> E
R : is_e nil @
============================
 <is_e {P}> nil
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (cons E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
============================
 <is_e {P}> (cons E1 E2)
 < apply IH to R1.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (cons E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (cons E1 E2)
 < apply IH to R2.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (cons E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
H2 : <is_e {P}> E2
============================
 <is_e {P}> (cons E1 E2)
 < search.

Subgoal 11:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (null E1) @
R1 : is_e E1 *
============================
 <is_e {P}> (null E1)
 < apply IH to R1.

Subgoal 11:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (null E1) @
R1 : is_e E1 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (null E1)
 < search.

Subgoal 12:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (head E1) @
R1 : is_e E1 *
============================
 <is_e {P}> (head E1)
 < apply IH to R1.

Subgoal 12:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (head E1) @
R1 : is_e E1 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (head E1)
 < search.

Subgoal 13:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (tail E1) @
R1 : is_e E1 *
============================
 <is_e {P}> (tail E1)
 < apply IH to R1.

Subgoal 13:

Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (tail E1) @
R1 : is_e E1 *
H1 : <is_e {P}> E1
============================
 <is_e {P}> (tail E1)
 < search.

Proof completed.
 < Prove library:host:is_e_var_or_not.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e nil @
============================
 (exists N, nil = var N) \/ ((exists N, nil = var N) -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists N, cons E1 E2 = var N) \/ ((exists N, cons E1 E2 = var N) -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists N, null E1 = var N) \/ ((exists N, null E1 = var N) -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists N, head E1 = var N) \/ ((exists N, head E1 = var N) -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists N, tail E1 = var N) \/ ((exists N, tail E1 = var N) -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_intlit_or_not.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists I, E = intlit I) \/
       ((exists I, E = intlit I) -> false)
IsE : is_e nil @
============================
 (exists I, nil = intlit I) \/ ((exists I, nil = intlit I) -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists I, E = intlit I) \/
       ((exists I, E = intlit I) -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists I, cons E1 E2 = intlit I) \/
 ((exists I, cons E1 E2 = intlit I) -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists I, E = intlit I) \/
       ((exists I, E = intlit I) -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists I, null E1 = intlit I) \/ ((exists I, null E1 = intlit I) -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists I, E = intlit I) \/
       ((exists I, E = intlit I) -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists I, head E1 = intlit I) \/ ((exists I, head E1 = intlit I) -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists I, E = intlit I) \/
       ((exists I, E = intlit I) -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists I, tail E1 = intlit I) \/ ((exists I, tail E1 = intlit I) -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_trueE_or_not.

Subgoal 9:

IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e nil @
============================
 nil = trueE \/ (nil = trueE -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 cons E1 E2 = trueE \/ (cons E1 E2 = trueE -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 null E1 = trueE \/ (null E1 = trueE -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 head E1 = trueE \/ (head E1 = trueE -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 tail E1 = trueE \/ (tail E1 = trueE -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_falseE_or_not.

Subgoal 9:

IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e nil @
============================
 nil = falseE \/ (nil = falseE -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 cons E1 E2 = falseE \/ (cons E1 E2 = falseE -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 null E1 = falseE \/ (null E1 = falseE -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 head E1 = falseE \/ (head E1 = falseE -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 tail E1 = falseE \/ (tail E1 = falseE -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_add_or_not.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E1 E2, E = add E1 E2) \/
       ((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e nil @
============================
 (exists E1 E2, nil = add E1 E2) \/ ((exists E1 E2, nil = add E1 E2) -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = add E1 E2) \/
       ((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, cons E1 E2 = add E3 E4) \/
 ((exists E3 E4, cons E1 E2 = add E3 E4) -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = add E1 E2) \/
       ((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, null E1 = add E2 E3) \/
 ((exists E2 E3, null E1 = add E2 E3) -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = add E1 E2) \/
       ((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, head E1 = add E2 E3) \/
 ((exists E2 E3, head E1 = add E2 E3) -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = add E1 E2) \/
       ((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, tail E1 = add E2 E3) \/
 ((exists E2 E3, tail E1 = add E2 E3) -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_eqC_or_not.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E1 E2, E = eq E1 E2) \/
       ((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e nil @
============================
 (exists E1 E2, nil = eq E1 E2) \/ ((exists E1 E2, nil = eq E1 E2) -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = eq E1 E2) \/
       ((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, cons E1 E2 = eq E3 E4) \/
 ((exists E3 E4, cons E1 E2 = eq E3 E4) -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = eq E1 E2) \/
       ((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, null E1 = eq E2 E3) \/
 ((exists E2 E3, null E1 = eq E2 E3) -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = eq E1 E2) \/
       ((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, head E1 = eq E2 E3) \/
 ((exists E2 E3, head E1 = eq E2 E3) -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = eq E1 E2) \/
       ((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, tail E1 = eq E2 E3) \/
 ((exists E2 E3, tail E1 = eq E2 E3) -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_gt_or_not.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E1 E2, E = gt E1 E2) \/
       ((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e nil @
============================
 (exists E1 E2, nil = gt E1 E2) \/ ((exists E1 E2, nil = gt E1 E2) -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = gt E1 E2) \/
       ((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, cons E1 E2 = gt E3 E4) \/
 ((exists E3 E4, cons E1 E2 = gt E3 E4) -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = gt E1 E2) \/
       ((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, null E1 = gt E2 E3) \/
 ((exists E2 E3, null E1 = gt E2 E3) -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = gt E1 E2) \/
       ((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, head E1 = gt E2 E3) \/
 ((exists E2 E3, head E1 = gt E2 E3) -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = gt E1 E2) \/
       ((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, tail E1 = gt E2 E3) \/
 ((exists E2 E3, tail E1 = gt E2 E3) -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_not_or_not.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e nil @
============================
 (exists E', nil = not E') \/ ((exists E', nil = not E') -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', cons E1 E2 = not E') \/ ((exists E', cons E1 E2 = not E') -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E', null E1 = not E') \/ ((exists E', null E1 = not E') -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E', head E1 = not E') \/ ((exists E', head E1 = not E') -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E', tail E1 = not E') \/ ((exists E', tail E1 = not E') -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_e_nil_or_not : forall E,
         IsE : is_e E ->
         E = library:list:nil \/
         (E = library:list:nil -> false)
      on IsE.

Subgoal 1:

Variables: S
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
 var S = nil \/ (var S = nil -> false)
 < search.

Subgoal 2:

Variables: I
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
 intlit I = nil \/ (intlit I = nil -> false)
 < search.

Subgoal 3:

IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e trueE @
============================
 trueE = nil \/ (trueE = nil -> false)
 < search.

Subgoal 4:

IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e falseE @
============================
 falseE = nil \/ (falseE = nil -> false)
 < search.

Subgoal 5:

Variables: E2 E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 add E1 E2 = nil \/ (add E1 E2 = nil -> false)
 < search.

Subgoal 6:

Variables: E2 E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 eq E1 E2 = nil \/ (eq E1 E2 = nil -> false)
 < search.

Subgoal 7:

Variables: E2 E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 gt E1 E2 = nil \/ (gt E1 E2 = nil -> false)
 < search.

Subgoal 8:

Variables: E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
 not E1 = nil \/ (not E1 = nil -> false)
 < search.

Subgoal 9:

IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e nil @
============================
 nil = nil \/ (nil = nil -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 cons E1 E2 = nil \/ (cons E1 E2 = nil -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 null E1 = nil \/ (null E1 = nil -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 head E1 = nil \/ (head E1 = nil -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 tail E1 = nil \/ (tail E1 = nil -> false)
 < search.

Subgoal 14:

Variables: X_T
IH : forall E, is_e E * -> E = nil \/ (E = nil -> false)
IsE : is_e <unknown K is_e> @
IsE1 : |{e}- <unknown K is_e> ~~> X_T
IsE2 : is_e X_T *
============================
 <unknown K is_e> = nil \/ (<unknown K is_e> = nil -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_e_cons_or_not : forall E,
         IsE : is_e E ->
         (exists E1 E2, E = cons E1 E2) \/
         ((exists E1 E2, E = cons E1 E2) -> false)
      on IsE.

Subgoal 1:

Variables: S
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
 (exists E1 E2, var S = cons E1 E2) \/
 ((exists E1 E2, var S = cons E1 E2) -> false)
 < search.

Subgoal 2:

Variables: I
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
 (exists E1 E2, intlit I = cons E1 E2) \/
 ((exists E1 E2, intlit I = cons E1 E2) -> false)
 < search.

Subgoal 3:

IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e trueE @
============================
 (exists E1 E2, trueE = cons E1 E2) \/
 ((exists E1 E2, trueE = cons E1 E2) -> false)
 < search.

Subgoal 4:

IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e falseE @
============================
 (exists E1 E2, falseE = cons E1 E2) \/
 ((exists E1 E2, falseE = cons E1 E2) -> false)
 < search.

Subgoal 5:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, add E1 E2 = cons E3 E4) \/
 ((exists E3 E4, add E1 E2 = cons E3 E4) -> false)
 < search.

Subgoal 6:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, eq E1 E2 = cons E3 E4) \/
 ((exists E3 E4, eq E1 E2 = cons E3 E4) -> false)
 < search.

Subgoal 7:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, gt E1 E2 = cons E3 E4) \/
 ((exists E3 E4, gt E1 E2 = cons E3 E4) -> false)
 < search.

Subgoal 8:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, not E1 = cons E2 E3) \/
 ((exists E2 E3, not E1 = cons E2 E3) -> false)
 < search.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e nil @
============================
 (exists E1 E2, nil = cons E1 E2) \/ ((exists E1 E2, nil = cons E1 E2) -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E3 E4, cons E1 E2 = cons E3 E4) \/
 ((exists E3 E4, cons E1 E2 = cons E3 E4) -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, null E1 = cons E2 E3) \/
 ((exists E2 E3, null E1 = cons E2 E3) -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, head E1 = cons E2 E3) \/
 ((exists E2 E3, head E1 = cons E2 E3) -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E2 E3, tail E1 = cons E2 E3) \/
 ((exists E2 E3, tail E1 = cons E2 E3) -> false)
 < search.

Subgoal 14:

Variables: X_T
IH : forall E,
       is_e E * -> (exists E1 E2, E = cons E1 E2) \/
       ((exists E1 E2, E = cons E1 E2) -> false)
IsE : is_e <unknown K is_e> @
IsE1 : |{e}- <unknown K is_e> ~~> X_T
IsE2 : is_e X_T *
============================
 (exists E1 E2, <unknown K is_e> = cons E1 E2) \/
 ((exists E1 E2, <unknown K is_e> = cons E1 E2) -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_e_null_or_not : forall E,
         IsE : is_e E ->
         (exists E', E = null E') \/
         ((exists E', E = null E') -> false)
      on IsE.

Subgoal 1:

Variables: S
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
 (exists E', var S = null E') \/ ((exists E', var S = null E') -> false)
 < search.

Subgoal 2:

Variables: I
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
 (exists E', intlit I = null E') \/ ((exists E', intlit I = null E') -> false)
 < search.

Subgoal 3:

IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e trueE @
============================
 (exists E', trueE = null E') \/ ((exists E', trueE = null E') -> false)
 < search.

Subgoal 4:

IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e falseE @
============================
 (exists E', falseE = null E') \/ ((exists E', falseE = null E') -> false)
 < search.

Subgoal 5:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', add E1 E2 = null E') \/ ((exists E', add E1 E2 = null E') -> false)
 < search.

Subgoal 6:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', eq E1 E2 = null E') \/ ((exists E', eq E1 E2 = null E') -> false)
 < search.

Subgoal 7:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', gt E1 E2 = null E') \/ ((exists E', gt E1 E2 = null E') -> false)
 < search.

Subgoal 8:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
 (exists E', not E1 = null E') \/ ((exists E', not E1 = null E') -> false)
 < search.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e nil @
============================
 (exists E', nil = null E') \/ ((exists E', nil = null E') -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', cons E1 E2 = null E') \/
 ((exists E', cons E1 E2 = null E') -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E', null E1 = null E') \/ ((exists E', null E1 = null E') -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E', head E1 = null E') \/ ((exists E', head E1 = null E') -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E', tail E1 = null E') \/ ((exists E', tail E1 = null E') -> false)
 < search.

Subgoal 14:

Variables: X_T
IH : forall E,
       is_e E * -> (exists E', E = null E') \/
       ((exists E', E = null E') -> false)
IsE : is_e <unknown K is_e> @
IsE1 : |{e}- <unknown K is_e> ~~> X_T
IsE2 : is_e X_T *
============================
 (exists E', <unknown K is_e> = null E') \/
 ((exists E', <unknown K is_e> = null E') -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_e_head_or_not : forall E,
         IsE : is_e E ->
         (exists E', E = head E') \/
         ((exists E', E = head E') -> false)
      on IsE.

Subgoal 1:

Variables: S
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
 (exists E', var S = head E') \/ ((exists E', var S = head E') -> false)
 < search.

Subgoal 2:

Variables: I
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
 (exists E', intlit I = head E') \/ ((exists E', intlit I = head E') -> false)
 < search.

Subgoal 3:

IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e trueE @
============================
 (exists E', trueE = head E') \/ ((exists E', trueE = head E') -> false)
 < search.

Subgoal 4:

IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e falseE @
============================
 (exists E', falseE = head E') \/ ((exists E', falseE = head E') -> false)
 < search.

Subgoal 5:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', add E1 E2 = head E') \/ ((exists E', add E1 E2 = head E') -> false)
 < search.

Subgoal 6:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', eq E1 E2 = head E') \/ ((exists E', eq E1 E2 = head E') -> false)
 < search.

Subgoal 7:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', gt E1 E2 = head E') \/ ((exists E', gt E1 E2 = head E') -> false)
 < search.

Subgoal 8:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
 (exists E', not E1 = head E') \/ ((exists E', not E1 = head E') -> false)
 < search.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e nil @
============================
 (exists E', nil = head E') \/ ((exists E', nil = head E') -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', cons E1 E2 = head E') \/
 ((exists E', cons E1 E2 = head E') -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E', null E1 = head E') \/ ((exists E', null E1 = head E') -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E', head E1 = head E') \/ ((exists E', head E1 = head E') -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E', tail E1 = head E') \/ ((exists E', tail E1 = head E') -> false)
 < search.

Subgoal 14:

Variables: X_T
IH : forall E,
       is_e E * -> (exists E', E = head E') \/
       ((exists E', E = head E') -> false)
IsE : is_e <unknown K is_e> @
IsE1 : |{e}- <unknown K is_e> ~~> X_T
IsE2 : is_e X_T *
============================
 (exists E', <unknown K is_e> = head E') \/
 ((exists E', <unknown K is_e> = head E') -> false)
 < search.

Proof completed.
 < Extensible_Theorem
      is_e_tail_or_not : forall E,
         IsE : is_e E ->
         (exists E', E = tail E') \/
         ((exists E', E = tail E') -> false)
      on IsE.

Subgoal 1:

Variables: S
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
 (exists E', var S = tail E') \/ ((exists E', var S = tail E') -> false)
 < search.

Subgoal 2:

Variables: I
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
 (exists E', intlit I = tail E') \/ ((exists E', intlit I = tail E') -> false)
 < search.

Subgoal 3:

IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e trueE @
============================
 (exists E', trueE = tail E') \/ ((exists E', trueE = tail E') -> false)
 < search.

Subgoal 4:

IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e falseE @
============================
 (exists E', falseE = tail E') \/ ((exists E', falseE = tail E') -> false)
 < search.

Subgoal 5:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', add E1 E2 = tail E') \/ ((exists E', add E1 E2 = tail E') -> false)
 < search.

Subgoal 6:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', eq E1 E2 = tail E') \/ ((exists E', eq E1 E2 = tail E') -> false)
 < search.

Subgoal 7:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', gt E1 E2 = tail E') \/ ((exists E', gt E1 E2 = tail E') -> false)
 < search.

Subgoal 8:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
 (exists E', not E1 = tail E') \/ ((exists E', not E1 = tail E') -> false)
 < search.

Subgoal 9:

IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e nil @
============================
 (exists E', nil = tail E') \/ ((exists E', nil = tail E') -> false)
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 (exists E', cons E1 E2 = tail E') \/
 ((exists E', cons E1 E2 = tail E') -> false)
 < search.

Subgoal 11:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 (exists E', null E1 = tail E') \/ ((exists E', null E1 = tail E') -> false)
 < search.

Subgoal 12:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 (exists E', head E1 = tail E') \/ ((exists E', head E1 = tail E') -> false)
 < search.

Subgoal 13:

Variables: E1
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 (exists E', tail E1 = tail E') \/ ((exists E', tail E1 = tail E') -> false)
 < search.

Subgoal 14:

Variables: X_T
IH : forall E,
       is_e E * -> (exists E', E = tail E') \/
       ((exists E', E = tail E') -> false)
IsE : is_e <unknown K is_e> @
IsE1 : |{e}- <unknown K is_e> ~~> X_T
IsE2 : is_e X_T *
============================
 (exists E', <unknown K is_e> = tail E') \/
 ((exists E', <unknown K is_e> = tail E') -> false)
 < search.

Proof completed.
 < Prove library:host:is_e_eq_or_not.

Subgoal 9:

Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e E2
============================
 nil = E2 \/ (nil = E2 -> false)
 < Or: apply is_e_nil_or_not to IsE2.

Subgoal 9:

Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e E2
Or : E2 = nil \/ (E2 = nil -> false)
============================
 nil = E2 \/ (nil = E2 -> false)
 < E: case Or.

Subgoal 9.1:

IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e nil
============================
 nil = nil \/ (nil = nil -> false)
 < search.

Subgoal 9.2:

Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e E2
E : E2 = nil -> false
============================
 nil = E2 \/ (nil = E2 -> false)
 < right.

Subgoal 9.2:

Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e E2
E : E2 = nil -> false
============================
 nil = E2 -> false
 < intros Eq.

Subgoal 9.2:

Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e E2
E : E2 = nil -> false
Eq : nil = E2
============================
 false
 < case Eq.

Subgoal 9.2:

IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e nil @
IsE2 : is_e nil
E : nil = nil -> false
============================
 false
 < backchain E.

Subgoal 10:

Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
 cons E3 E = E2 \/ (cons E3 E = E2 -> false)
 < Or: apply is_e_cons_or_not to IsE2.

Subgoal 10:

Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
Or : (exists E1 E3, E2 = cons E1 E3) \/
     ((exists E1 E3, E2 = cons E1 E3) -> false)
============================
 cons E3 E = E2 \/ (cons E3 E = E2 -> false)
 < E: case Or.

Subgoal 10.1:

Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e (cons E4 E5)
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
 cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
 < Is: case IsE2.

Subgoal 10.1:

Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
 cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
 < Or: apply IH to IsE3 Is.

Subgoal 10.1:

Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E3 = E4 \/ (E3 = E4 -> false)
============================
 cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
 < E: case Or.

Subgoal 10.1.1:

Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
 cons E4 E = cons E4 E5 \/ (cons E4 E = cons E4 E5 -> false)
 < Or: apply IH to IsE4 Is1.

Subgoal 10.1.1:

Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E = E5 \/ (E = E5 -> false)
============================
 cons E4 E = cons E4 E5 \/ (cons E4 E = cons E4 E5 -> false)
 < E: case Or.

Subgoal 10.1.1.1:

Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E5) @
IsE3 : is_e E4 *
IsE4 : is_e E5 *
Is : is_e E4
Is1 : is_e E5
============================
 cons E4 E5 = cons E4 E5 \/ (cons E4 E5 = cons E4 E5 -> false)
 < search.

Subgoal 10.1.1.2:

Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
 cons E4 E = cons E4 E5 \/ (cons E4 E = cons E4 E5 -> false)
 < right.

Subgoal 10.1.1.2:

Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
 cons E4 E = cons E4 E5 -> false
 < intros Eq.

Subgoal 10.1.1.2:

Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
Eq : cons E4 E = cons E4 E5
============================
 false
 < case Eq.

Subgoal 10.1.1.2:

Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E5) @
IsE3 : is_e E4 *
IsE4 : is_e E5 *
Is : is_e E4
Is1 : is_e E5
E : E5 = E5 -> false
============================
 false
 < backchain E.

Subgoal 10.1.2:

Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
 cons E3 E = cons E4 E5 \/ (cons E3 E = cons E4 E5 -> false)
 < right.

Subgoal 10.1.2:

Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
 cons E3 E = cons E4 E5 -> false
 < intros Eq.

Subgoal 10.1.2:

Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
Eq : cons E3 E = cons E4 E5
============================
 false
 < case Eq.

Subgoal 10.1.2:

Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E4 E5) @
IsE3 : is_e E4 *
IsE4 : is_e E5 *
Is : is_e E4
Is1 : is_e E5
E : E4 = E4 -> false
============================
 false
 < backchain E.

Subgoal 10.2:

Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = cons E1 E3) -> false
============================
 cons E3 E = E2 \/ (cons E3 E = E2 -> false)
 < right.

Subgoal 10.2:

Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = cons E1 E3) -> false
============================
 cons E3 E = E2 -> false
 < intros Eq.

Subgoal 10.2:

Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = cons E1 E3) -> false
Eq : cons E3 E = E2
============================
 false
 < backchain E.

Subgoal 10.2:

Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = cons E1 E3) -> false
Eq : cons E3 E = E2
============================
 exists E1 E3, E2 = cons E1 E3
 < case Eq.

Subgoal 10.2:

Variables: E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (cons E3 E) @
IsE2 : is_e (cons E3 E)
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E2, cons E3 E = cons E1 E2) -> false
============================
 exists E1 E2, cons E3 E = cons E1 E2
 < search.

Subgoal 11:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e E2
IsE3 : is_e E *
============================
 null E = E2 \/ (null E = E2 -> false)
 < Or: apply is_e_null_or_not to IsE2.

Subgoal 11:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e E2
IsE3 : is_e E *
Or : (exists E', E2 = null E') \/ ((exists E', E2 = null E') -> false)
============================
 null E = E2 \/ (null E = E2 -> false)
 < E: case Or.

Subgoal 11.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e (null E')
IsE3 : is_e E *
============================
 null E = null E' \/ (null E = null E' -> false)
 < Is: case IsE2.

Subgoal 11.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE3 : is_e E *
Is : is_e E'
============================
 null E = null E' \/ (null E = null E' -> false)
 < Or: apply IH to IsE3 Is.

Subgoal 11.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE3 : is_e E *
Is : is_e E'
Or : E = E' \/ (E = E' -> false)
============================
 null E = null E' \/ (null E = null E' -> false)
 < E: case Or.

Subgoal 11.1.1:

Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E') @
IsE3 : is_e E' *
Is : is_e E'
============================
 null E' = null E' \/ (null E' = null E' -> false)
 < search.

Subgoal 11.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
 null E = null E' \/ (null E = null E' -> false)
 < right.

Subgoal 11.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
 null E = null E' -> false
 < intros Eq.

Subgoal 11.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
Eq : null E = null E'
============================
 false
 < case Eq.

Subgoal 11.1.2:

Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E') @
IsE3 : is_e E' *
Is : is_e E'
E : E' = E' -> false
============================
 false
 < backchain E.

Subgoal 11.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = null E') -> false
============================
 null E = E2 \/ (null E = E2 -> false)
 < right.

Subgoal 11.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = null E') -> false
============================
 null E = E2 -> false
 < intros Eq.

Subgoal 11.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = null E') -> false
Eq : null E = E2
============================
 false
 < backchain E.

Subgoal 11.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = null E') -> false
Eq : null E = E2
============================
 exists E', E2 = null E'
 < case Eq.

Subgoal 11.2:

Variables: E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (null E) @
IsE2 : is_e (null E)
IsE3 : is_e E *
E : (exists E', null E = null E') -> false
============================
 exists E', null E = null E'
 < search.

Subgoal 12:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e E2
IsE3 : is_e E *
============================
 head E = E2 \/ (head E = E2 -> false)
 < Or: apply is_e_head_or_not to IsE2.

Subgoal 12:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e E2
IsE3 : is_e E *
Or : (exists E', E2 = head E') \/ ((exists E', E2 = head E') -> false)
============================
 head E = E2 \/ (head E = E2 -> false)
 < E: case Or.

Subgoal 12.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e (head E')
IsE3 : is_e E *
============================
 head E = head E' \/ (head E = head E' -> false)
 < Is: case IsE2.

Subgoal 12.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE3 : is_e E *
Is : is_e E'
============================
 head E = head E' \/ (head E = head E' -> false)
 < Or: apply IH to IsE3 Is.

Subgoal 12.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE3 : is_e E *
Is : is_e E'
Or : E = E' \/ (E = E' -> false)
============================
 head E = head E' \/ (head E = head E' -> false)
 < E: case Or.

Subgoal 12.1.1:

Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E') @
IsE3 : is_e E' *
Is : is_e E'
============================
 head E' = head E' \/ (head E' = head E' -> false)
 < search.

Subgoal 12.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
 head E = head E' \/ (head E = head E' -> false)
 < right.

Subgoal 12.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
 head E = head E' -> false
 < intros Eq.

Subgoal 12.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
Eq : head E = head E'
============================
 false
 < case Eq.

Subgoal 12.1.2:

Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E') @
IsE3 : is_e E' *
Is : is_e E'
E : E' = E' -> false
============================
 false
 < backchain E.

Subgoal 12.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = head E') -> false
============================
 head E = E2 \/ (head E = E2 -> false)
 < right.

Subgoal 12.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = head E') -> false
============================
 head E = E2 -> false
 < intros Eq.

Subgoal 12.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = head E') -> false
Eq : head E = E2
============================
 false
 < backchain E.

Subgoal 12.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = head E') -> false
Eq : head E = E2
============================
 exists E', E2 = head E'
 < case Eq.

Subgoal 12.2:

Variables: E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (head E) @
IsE2 : is_e (head E)
IsE3 : is_e E *
E : (exists E', head E = head E') -> false
============================
 exists E', head E = head E'
 < search.

Subgoal 13:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e E2
IsE3 : is_e E *
============================
 tail E = E2 \/ (tail E = E2 -> false)
 < Or: apply is_e_tail_or_not to IsE2.

Subgoal 13:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e E2
IsE3 : is_e E *
Or : (exists E', E2 = tail E') \/ ((exists E', E2 = tail E') -> false)
============================
 tail E = E2 \/ (tail E = E2 -> false)
 < E: case Or.

Subgoal 13.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e (tail E')
IsE3 : is_e E *
============================
 tail E = tail E' \/ (tail E = tail E' -> false)
 < Is: case IsE2.

Subgoal 13.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE3 : is_e E *
Is : is_e E'
============================
 tail E = tail E' \/ (tail E = tail E' -> false)
 < Or: apply IH to IsE3 Is.

Subgoal 13.1:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE3 : is_e E *
Is : is_e E'
Or : E = E' \/ (E = E' -> false)
============================
 tail E = tail E' \/ (tail E = tail E' -> false)
 < E: case Or.

Subgoal 13.1.1:

Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E') @
IsE3 : is_e E' *
Is : is_e E'
============================
 tail E' = tail E' \/ (tail E' = tail E' -> false)
 < search.

Subgoal 13.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
 tail E = tail E' \/ (tail E = tail E' -> false)
 < right.

Subgoal 13.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
 tail E = tail E' -> false
 < intros Eq.

Subgoal 13.1.2:

Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
Eq : tail E = tail E'
============================
 false
 < case Eq.

Subgoal 13.1.2:

Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E') @
IsE3 : is_e E' *
Is : is_e E'
E : E' = E' -> false
============================
 false
 < backchain E.

Subgoal 13.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = tail E') -> false
============================
 tail E = E2 \/ (tail E = E2 -> false)
 < right.

Subgoal 13.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = tail E') -> false
============================
 tail E = E2 -> false
 < intros Eq.

Subgoal 13.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = tail E') -> false
Eq : tail E = E2
============================
 false
 < backchain E.

Subgoal 13.2:

Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = tail E') -> false
Eq : tail E = E2
============================
 exists E', E2 = tail E'
 < case Eq.

Subgoal 13.2:

Variables: E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (tail E) @
IsE2 : is_e (tail E)
IsE3 : is_e E *
E : (exists E', tail E = tail E') -> false
============================
 exists E', tail E = tail E'
 < search.

Proof completed.
 < Prove library:host:vars_unique.

Subgoal 9:

Variables: V2
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars nil [] @
Vars2 : vars nil V2
============================
 [] = V2
 < case Vars2.

Subgoal 9:

IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars nil [] @
============================
 [] = []
 < search.

Subgoal 10:

Variables: V1 V2 Vr1 Vr2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (cons E1 E2) V1 @
Vars2 : vars (cons E1 E2) V2
Vars3 : vars E1 Vr1 *
Vars4 : vars E2 Vr2 *
Vars5 : Vr1 ++ Vr2 = V1
============================
 V1 = V2
 < V: case Vars2.

Subgoal 10:

Variables: V1 V2 Vr1 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (cons E1 E2) V1 @
Vars3 : vars E1 Vr1 *
Vars4 : vars E2 Vr2 *
Vars5 : Vr1 ++ Vr2 = V1
V : vars E1 Vr3
V1 : vars E2 Vr4
V2 : Vr3 ++ Vr4 = V2
============================
 V1 = V2
 < apply IH to Vars3 V.

Subgoal 10:

Variables: V1 V2 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (cons E1 E2) V1 @
Vars3 : vars E1 Vr3 *
Vars4 : vars E2 Vr2 *
Vars5 : Vr3 ++ Vr2 = V1
V : vars E1 Vr3
V1 : vars E2 Vr4
V2 : Vr3 ++ Vr4 = V2
============================
 V1 = V2
 < apply IH to Vars4 V1.

Subgoal 10:

Variables: V1 V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (cons E1 E2) V1 @
Vars3 : vars E1 Vr3 *
Vars4 : vars E2 Vr4 *
Vars5 : Vr3 ++ Vr4 = V1
V : vars E1 Vr3
V1 : vars E2 Vr4
V2 : Vr3 ++ Vr4 = V2
============================
 V1 = V2
 < apply append_unique to Vars5 V2.

Subgoal 10:

Variables: V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (cons E1 E2) V2 @
Vars3 : vars E1 Vr3 *
Vars4 : vars E2 Vr4 *
Vars5 : Vr3 ++ Vr4 = V2
V : vars E1 Vr3
V1 : vars E2 Vr4
V2 : Vr3 ++ Vr4 = V2
============================
 V2 = V2
 < search.

Subgoal 11:

Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (null E1) V1 @
Vars2 : vars (null E1) V2
Vars3 : vars E1 V1 *
============================
 V1 = V2
 < V: case Vars2.

Subgoal 11:

Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (null E1) V1 @
Vars3 : vars E1 V1 *
V : vars E1 V2
============================
 V1 = V2
 < apply IH to Vars3 V.

Subgoal 11:

Variables: V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (null E1) V2 @
Vars3 : vars E1 V2 *
V : vars E1 V2
============================
 V2 = V2
 < search.

Subgoal 12:

Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (head E1) V1 @
Vars2 : vars (head E1) V2
Vars3 : vars E1 V1 *
============================
 V1 = V2
 < V: case Vars2.

Subgoal 12:

Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (head E1) V1 @
Vars3 : vars E1 V1 *
V : vars E1 V2
============================
 V1 = V2
 < apply IH to Vars3 V.

Subgoal 12:

Variables: V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (head E1) V2 @
Vars3 : vars E1 V2 *
V : vars E1 V2
============================
 V2 = V2
 < search.

Subgoal 13:

Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (tail E1) V1 @
Vars2 : vars (tail E1) V2
Vars3 : vars E1 V1 *
============================
 V1 = V2
 < V: case Vars2.

Subgoal 13:

Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (tail E1) V1 @
Vars3 : vars E1 V1 *
V : vars E1 V2
============================
 V1 = V2
 < apply IH to Vars3 V.

Subgoal 13:

Variables: V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (tail E1) V2 @
Vars3 : vars E1 V2 *
V : vars E1 V2
============================
 V2 = V2
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_e_vars_exist.

Subgoal 1:

Variables: E' V
Hyp : |{e}- null E' ~~> E'
Hyp1 : vars (null E') V
============================
 exists V', vars E' V'
 < case Hyp1.

Subgoal 1:

Variables: E' V
Hyp : |{e}- null E' ~~> E'
H1 : vars E' V
============================
 exists V', vars E' V'
 < search.

Subgoal 2:

Variables: E' V
Hyp : |{e}- head E' ~~> E'
Hyp1 : vars (head E') V
============================
 exists V', vars E' V'
 < case Hyp1.

Subgoal 2:

Variables: E' V
Hyp : |{e}- head E' ~~> E'
H1 : vars E' V
============================
 exists V', vars E' V'
 < search.

Subgoal 3:

Variables: E' V
Hyp : |{e}- tail E' ~~> E'
Hyp1 : vars (tail E') V
============================
 exists V', vars E' V'
 < case Hyp1.

Subgoal 3:

Variables: E' V
Hyp : |{e}- tail E' ~~> E'
H1 : vars E' V
============================
 exists V', vars E' V'
 < search.

Subgoal 4:

Variables: V
Hyp : |{e}- nil ~~> trueE
Hyp1 : vars nil V
============================
 exists V', vars trueE V'
 < search.

Subgoal 5:

Variables: V E2 E1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp1 : vars (cons E1 E2) V
============================
 exists V', vars (eq E1 E2) V'
 < case Hyp1.

Subgoal 5:

Variables: V E2 E1 Vr1 Vr2
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
H1 : vars E1 Vr1
H2 : vars E2 Vr2
H3 : Vr1 ++ Vr2 = V
============================
 exists V', vars (eq E1 E2) V'
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_e_vars.

Subgoal 1:

Variables: E' V V' X
Hyp : |{e}- null E' ~~> E'
Hyp1 : vars (null E') V
Hyp2 : vars E' V'
Hyp3 : mem X V
============================
 mem X V'
 < V: case Hyp1.

Subgoal 1:

Variables: E' V V' X
Hyp : |{e}- null E' ~~> E'
Hyp2 : vars E' V'
Hyp3 : mem X V
V : vars E' V
============================
 mem X V'
 < apply vars_unique to V Hyp2.

Subgoal 1:

Variables: E' V' X
Hyp : |{e}- null E' ~~> E'
Hyp2 : vars E' V'
Hyp3 : mem X V'
V : vars E' V'
============================
 mem X V'
 < search.

Subgoal 2:

Variables: E' V V' X
Hyp : |{e}- head E' ~~> E'
Hyp1 : vars (head E') V
Hyp2 : vars E' V'
Hyp3 : mem X V
============================
 mem X V'
 < V: case Hyp1.

Subgoal 2:

Variables: E' V V' X
Hyp : |{e}- head E' ~~> E'
Hyp2 : vars E' V'
Hyp3 : mem X V
V : vars E' V
============================
 mem X V'
 < apply vars_unique to V Hyp2.

Subgoal 2:

Variables: E' V' X
Hyp : |{e}- head E' ~~> E'
Hyp2 : vars E' V'
Hyp3 : mem X V'
V : vars E' V'
============================
 mem X V'
 < search.

Subgoal 3:

Variables: E' V V' X
Hyp : |{e}- tail E' ~~> E'
Hyp1 : vars (tail E') V
Hyp2 : vars E' V'
Hyp3 : mem X V
============================
 mem X V'
 < V: case Hyp1.

Subgoal 3:

Variables: E' V V' X
Hyp : |{e}- tail E' ~~> E'
Hyp2 : vars E' V'
Hyp3 : mem X V
V : vars E' V
============================
 mem X V'
 < apply vars_unique to V Hyp2.

Subgoal 3:

Variables: E' V' X
Hyp : |{e}- tail E' ~~> E'
Hyp2 : vars E' V'
Hyp3 : mem X V'
V : vars E' V'
============================
 mem X V'
 < search.

Subgoal 4:

Variables: V V' X
Hyp : |{e}- nil ~~> trueE
Hyp1 : vars nil V
Hyp2 : vars trueE V'
Hyp3 : mem X V
============================
 mem X V'
 < case Hyp1.

Subgoal 4:

Variables: V' X
Hyp : |{e}- nil ~~> trueE
Hyp2 : vars trueE V'
Hyp3 : mem X []
============================
 mem X V'
 < case Hyp2.

Subgoal 4:

Variables: X
Hyp : |{e}- nil ~~> trueE
Hyp3 : mem X []
============================
 mem X []
 < search.

Subgoal 5:

Variables: V V' X E2 E1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp1 : vars (cons E1 E2) V
Hyp2 : vars (eq E1 E2) V'
Hyp3 : mem X V
============================
 mem X V'
 < V: case Hyp1.

Subgoal 5:

Variables: V V' X E2 E1 Vr1 Vr2
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : vars (eq E1 E2) V'
Hyp3 : mem X V
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
============================
 mem X V'
 < V': case Hyp2.

Subgoal 5:

Variables: V V' X E2 E1 Vr1 Vr2 Vr3 Vr4
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp3 : mem X V
V : vars E1 Vr1
V1 : vars E2 Vr2
V2 : Vr1 ++ Vr2 = V
V' : vars E1 Vr3
V'1 : vars E2 Vr4
V'2 : Vr3 ++ Vr4 = V'
============================
 mem X V'
 < apply vars_unique to V V'.

Subgoal 5:

Variables: V V' X E2 E1 Vr2 Vr3 Vr4
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp3 : mem X V
V : vars E1 Vr3
V1 : vars E2 Vr2
V2 : Vr3 ++ Vr2 = V
V' : vars E1 Vr3
V'1 : vars E2 Vr4
V'2 : Vr3 ++ Vr4 = V'
============================
 mem X V'
 < apply vars_unique to V1 V'1.

Subgoal 5:

Variables: V V' X E2 E1 Vr3 Vr4
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp3 : mem X V
V : vars E1 Vr3
V1 : vars E2 Vr4
V2 : Vr3 ++ Vr4 = V
V' : vars E1 Vr3
V'1 : vars E2 Vr4
V'2 : Vr3 ++ Vr4 = V'
============================
 mem X V'
 < apply append_unique to V2 V'2.

Subgoal 5:

Variables: V' X E2 E1 Vr3 Vr4
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp3 : mem X V'
V : vars E1 Vr3
V1 : vars E2 Vr4
V2 : Vr3 ++ Vr4 = V'
V' : vars E1 Vr3
V'1 : vars E2 Vr4
V'2 : Vr3 ++ Vr4 = V'
============================
 mem X V'
 < search.

Proof completed.
 < Prove library:host:vars_is.

Subgoal 9:

IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e nil
Vars : vars nil [] @
============================
 is_list is_string []
 < search.

Subgoal 10:

Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (cons E1 E2)
Vars : vars (cons E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
============================
 is_list is_string V
 < Is: case IsE.

Subgoal 10:

Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (cons E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
============================
 is_list is_string V
 < apply IH to Is Vars1.

Subgoal 10:

Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (cons E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
H1 : is_list is_string Vr1
============================
 is_list is_string V
 < apply IH to Is1 Vars2.

Subgoal 10:

Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (cons E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
H1 : is_list is_string Vr1
H2 : is_list is_string Vr2
============================
 is_list is_string V
 < apply append__is_list__is_string to _ _ Vars3.

Subgoal 10:

Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (cons E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
H1 : is_list is_string Vr1
H2 : is_list is_string Vr2
H3 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 11:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (null E1)
Vars : vars (null E1) V @
Vars1 : vars E1 V *
============================
 is_list is_string V
 < Is: case IsE.

Subgoal 11:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (null E1) V @
Vars1 : vars E1 V *
Is : is_e E1
============================
 is_list is_string V
 < apply IH to Is Vars1.

Subgoal 11:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (null E1) V @
Vars1 : vars E1 V *
Is : is_e E1
H1 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 12:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (head E1)
Vars : vars (head E1) V @
Vars1 : vars E1 V *
============================
 is_list is_string V
 < Is: case IsE.

Subgoal 12:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (head E1) V @
Vars1 : vars E1 V *
Is : is_e E1
============================
 is_list is_string V
 < apply IH to Is Vars1.

Subgoal 12:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (head E1) V @
Vars1 : vars E1 V *
Is : is_e E1
H1 : is_list is_string V
============================
 is_list is_string V
 < search.

Subgoal 13:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (tail E1)
Vars : vars (tail E1) V @
Vars1 : vars E1 V *
============================
 is_list is_string V
 < Is: case IsE.

Subgoal 13:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (tail E1) V @
Vars1 : vars E1 V *
Is : is_e E1
============================
 is_list is_string V
 < apply IH to Is Vars1.

Subgoal 13:

Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (tail E1) V @
Vars1 : vars E1 V *
Is : is_e E1
H1 : is_list is_string V
============================
 is_list is_string V
 < search.

Proof completed.
 < Prove library:host:vars_exist.

Subgoal 9:

IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e nil @
============================
 exists V, vars nil V
 < search.

Subgoal 10:

Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
 exists V, vars (cons E1 E2) V
 < V1: apply IH to IsE1.

Subgoal 10:

Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
============================
 exists V, vars (cons E1 E2) V
 < V2: apply IH to IsE2.

Subgoal 10:

Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
============================
 exists V, vars (cons E1 E2) V
 < Is1: apply vars_is to IsE1 V1.

Subgoal 10:

Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
Is1 : is_list is_string V
============================
 exists V, vars (cons E1 E2) V
 < Is2: apply vars_is to IsE2 V2.

Subgoal 10:

Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
Is1 : is_list is_string V
Is2 : is_list is_string V1
============================
 exists V, vars (cons E1 E2) V
 < apply append__is_list__is_string__total to Is1 Is2.

Subgoal 10:

Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (cons E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
Is1 : is_list is_string V
Is2 : is_list is_string V1
H1 : V ++ V1 = L
============================
 exists V, vars (cons E1 E2) V
 < search.

Subgoal 11:

Variables: E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (null E1) @
IsE1 : is_e E1 *
============================
 exists V, vars (null E1) V
 < apply IH to IsE1.

Subgoal 11:

Variables: E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (null E1) @
IsE1 : is_e E1 *
H1 : vars E1 V
============================
 exists V, vars (null E1) V
 < search.

Subgoal 12:

Variables: E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (head E1) @
IsE1 : is_e E1 *
============================
 exists V, vars (head E1) V
 < apply IH to IsE1.

Subgoal 12:

Variables: E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (head E1) @
IsE1 : is_e E1 *
H1 : vars E1 V
============================
 exists V, vars (head E1) V
 < search.

Subgoal 13:

Variables: E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
============================
 exists V, vars (tail E1) V
 < apply IH to IsE1.

Subgoal 13:

Variables: E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (tail E1) @
IsE1 : is_e E1 *
H1 : vars E1 V
============================
 exists V, vars (tail E1) V
 < search.

Proof completed.
 < Prove library:host:value_empty_typable.

Subgoal 4:

Variables: G Ty
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value nil @
Ty : ty_e G nil Ty
============================
 ty_e [] nil Ty
 < case Ty.

Subgoal 4:

Variables: G Ty1
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value nil @
============================
 ty_e [] nil (list Ty1)
 < search.

Subgoal 5:

Variables: G Ty E2 E1
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value (cons E1 E2) @
Ty : ty_e G (cons E1 E2) Ty
Value1 : value E1 *
Value2 : value E2 *
============================
 ty_e [] (cons E1 E2) Ty
 < Ty: case Ty.

Subgoal 5:

Variables: G E2 E1 Ty1
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value (cons E1 E2) @
Value1 : value E1 *
Value2 : value E2 *
Ty : ty_e G E1 Ty1
Ty1 : ty_e G E2 (list Ty1)
============================
 ty_e [] (cons E1 E2) (list Ty1)
 < apply IH to Value1 Ty.

Subgoal 5:

Variables: G E2 E1 Ty1
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value (cons E1 E2) @
Value1 : value E1 *
Value2 : value E2 *
Ty : ty_e G E1 Ty1
Ty1 : ty_e G E2 (list Ty1)
H1 : ty_e [] E1 Ty1
============================
 ty_e [] (cons E1 E2) (list Ty1)
 < apply IH to Value2 Ty1.

Subgoal 5:

Variables: G E2 E1 Ty1
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value (cons E1 E2) @
Value1 : value E1 *
Value2 : value E2 *
Ty : ty_e G E1 Ty1
Ty1 : ty_e G E2 (list Ty1)
H1 : ty_e [] E1 Ty1
H2 : ty_e [] E2 (list Ty1)
============================
 ty_e [] (cons E1 E2) (list Ty1)
 < search.

Proof completed.
 < Prove library:host:eval_e_is.

Subgoal 12:

Variables: G
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsE : is_e nil
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G nil nil @
============================
 is_e nil
 < search.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsE : is_e (cons E1 E2)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
============================
 is_e (cons V1 V2)
 < case IsE.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
H1 : is_e E1
H2 : is_e E2
============================
 is_e (cons V1 V2)
 < apply IH to _ _ Ev1.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
H1 : is_e E1
H2 : is_e E2
H3 : is_e V1
============================
 is_e (cons V1 V2)
 < apply IH to _ _ Ev2.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
H1 : is_e E1
H2 : is_e E2
H3 : is_e V1
H4 : is_e V2
============================
 is_e (cons V1 V2)
 < search.

Subgoal 14:

Variables: G E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsE : is_e (null E1)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (null E1) trueE @
Ev1 : eval_e G E1 nil *
============================
 is_e trueE
 < search.

Subgoal 15:

Variables: G V1 V2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsE : is_e (null E1)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (null E1) falseE @
Ev1 : eval_e G E1 (cons V1 V2) *
============================
 is_e falseE
 < search.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsE : is_e (head E1)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (head E1) V @
Ev1 : eval_e G E1 (cons V V2) *
============================
 is_e V
 < case IsE.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (head E1) V @
Ev1 : eval_e G E1 (cons V V2) *
H1 : is_e E1
============================
 is_e V
 < IsV: apply IH to _ _ Ev1.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (head E1) V @
Ev1 : eval_e G E1 (cons V V2) *
H1 : is_e E1
IsV : is_e (cons V V2)
============================
 is_e V
 < case IsV.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (head E1) V @
Ev1 : eval_e G E1 (cons V V2) *
H1 : is_e E1
H2 : is_e V
H3 : is_e V2
============================
 is_e V
 < search.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsE : is_e (tail E1)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (tail E1) V @
Ev1 : eval_e G E1 (cons V1 V) *
============================
 is_e V
 < case IsE.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (tail E1) V @
Ev1 : eval_e G E1 (cons V1 V) *
H1 : is_e E1
============================
 is_e V
 < IsV: apply IH to _ _ Ev1.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (tail E1) V @
Ev1 : eval_e G E1 (cons V1 V) *
H1 : is_e E1
IsV : is_e (cons V1 V)
============================
 is_e V
 < case IsV.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       is_e E -> is_list (is_pair is_string is_e) G -> eval_e G E V * -> is_e V
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (tail E1) V @
Ev1 : eval_e G E1 (cons V1 V) *
H1 : is_e E1
H2 : is_e V1
H3 : is_e V
============================
 is_e V
 < search.

Proof completed.
 < Prove library:host:type_preservation_e.

Subgoal 12:

Variables: TG EG Ty
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ty : ty_e TG nil Ty
Ev : eval_e EG nil nil @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
 ty_e [] nil Ty
 < case Ty.

Subgoal 12:

Variables: TG EG Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG nil nil @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
 ty_e [] nil (list Ty1)
 < search.

Subgoal 13:

Variables: TG EG Ty V2 V1 E2 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ty : ty_e TG (cons E1 E2) Ty
Ev : eval_e EG (cons E1 E2) (cons V1 V2) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 V1 *
Ev2 : eval_e EG E2 V2 *
============================
 ty_e [] (cons V1 V2) Ty
 < Ty: case Ty.

Subgoal 13:

Variables: TG EG V2 V1 E2 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (cons E1 E2) (cons V1 V2) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 V1 *
Ev2 : eval_e EG E2 V2 *
Ty : ty_e TG E1 Ty1
Ty1 : ty_e TG E2 (list Ty1)
============================
 ty_e [] (cons V1 V2) (list Ty1)
 < apply IH to Ty Ev1 Rel.

Subgoal 13:

Variables: TG EG V2 V1 E2 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (cons E1 E2) (cons V1 V2) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 V1 *
Ev2 : eval_e EG E2 V2 *
Ty : ty_e TG E1 Ty1
Ty1 : ty_e TG E2 (list Ty1)
H1 : ty_e [] V1 Ty1
============================
 ty_e [] (cons V1 V2) (list Ty1)
 < apply IH to Ty1 Ev2 Rel.

Subgoal 13:

Variables: TG EG V2 V1 E2 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (cons E1 E2) (cons V1 V2) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 V1 *
Ev2 : eval_e EG E2 V2 *
Ty : ty_e TG E1 Ty1
Ty1 : ty_e TG E2 (list Ty1)
H1 : ty_e [] V1 Ty1
H2 : ty_e [] V2 (list Ty1)
============================
 ty_e [] (cons V1 V2) (list Ty1)
 < search.

Subgoal 14:

Variables: TG EG Ty E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ty : ty_e TG (null E1) Ty
Ev : eval_e EG (null E1) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 nil *
============================
 ty_e [] trueE Ty
 < case Ty.

Subgoal 14:

Variables: TG EG E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (null E1) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 nil *
H1 : ty_e TG E1 (list Ty1)
============================
 ty_e [] trueE bool
 < search.

Subgoal 15:

Variables: TG EG Ty V1 V2 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ty : ty_e TG (null E1) Ty
Ev : eval_e EG (null E1) falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V1 V2) *
============================
 ty_e [] falseE Ty
 < case Ty.

Subgoal 15:

Variables: TG EG V1 V2 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (null E1) falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V1 V2) *
H1 : ty_e TG E1 (list Ty1)
============================
 ty_e [] falseE bool
 < search.

Subgoal 16:

Variables: TG EG Ty V V2 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ty : ty_e TG (head E1) Ty
Ev : eval_e EG (head E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V V2) *
============================
 ty_e [] V Ty
 < Ty: case Ty.

Subgoal 16:

Variables: TG EG Ty V V2 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (head E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V V2) *
Ty : ty_e TG E1 (list Ty)
============================
 ty_e [] V Ty
 < TV: apply IH to Ty Ev1 Rel.

Subgoal 16:

Variables: TG EG Ty V V2 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (head E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V V2) *
Ty : ty_e TG E1 (list Ty)
TV : ty_e [] (cons V V2) (list Ty)
============================
 ty_e [] V Ty
 < case TV.

Subgoal 16:

Variables: TG EG Ty V V2 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (head E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V V2) *
Ty : ty_e TG E1 (list Ty)
H1 : ty_e [] V Ty
H2 : ty_e [] V2 (list Ty)
============================
 ty_e [] V Ty
 < search.

Subgoal 17:

Variables: TG EG Ty V V1 E1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ty : ty_e TG (tail E1) Ty
Ev : eval_e EG (tail E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V1 V) *
============================
 ty_e [] V Ty
 < Ty: case Ty.

Subgoal 17:

Variables: TG EG V V1 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (tail E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V1 V) *
Ty : ty_e TG E1 (list Ty1)
============================
 ty_e [] V (list Ty1)
 < TV: apply IH to Ty Ev1 Rel.

Subgoal 17:

Variables: TG EG V V1 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (tail E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V1 V) *
Ty : ty_e TG E1 (list Ty1)
TV : ty_e [] (cons V1 V) (list Ty1)
============================
 ty_e [] V (list Ty1)
 < case TV.

Subgoal 17:

Variables: TG EG V V1 E1 Ty1
IH : forall TG EG E Ty V,
       ty_e TG E Ty -> eval_e EG E V * -> (forall X Ty1 V1,
         lookup TG X Ty1 -> lookup EG X V1 -> ty_e [] V1 Ty1) -> ty_e [] V Ty
Ev : eval_e EG (tail E1) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (cons V1 V) *
Ty : ty_e TG E1 (list Ty1)
H1 : ty_e [] V1 Ty1
H2 : ty_e [] V (list Ty1)
============================
 ty_e [] V (list Ty1)
 < search.

Proof completed.
 < Prove library:host:var_types_maintained.

Subgoal 7:

Variables: G' X Ty Ty1 E Tl Hd
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G' (splitlist Hd Tl E) G' @
Lkp : lookup G' X Ty
Ty1 : ty_e G' E (list Ty1)
Ty2 : lookup G' Hd Ty1
Ty3 : lookup G' Tl (list Ty1)
============================
 lookup G' X Ty
 < search.

Proof completed.
 < Prove library:host:type_preservation_s.

Subgoal 9:

Variables: TG EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ty : ty_s TG (splitlist Hd Tl E) TG'
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
============================
 ty_e [] V Ty
 < Ty: case Ty.

Subgoal 9:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
============================
 ty_e [] V Ty
 < TyCons: apply type_preservation_e to Ty Ev1 Rel.

Subgoal 9:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyCons : ty_e [] (cons V1 V2) (list Ty1)
============================
 ty_e [] V Ty
 < TyV: case TyCons.

Subgoal 9:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
============================
 ty_e [] V Ty
 < LV: case LkpV.

Subgoal 9.1:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist X Tl E) ((X, V)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V V2)
Ev2 : X = Tl -> false
Ev3 : select (X, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' X Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V Ty1
TyV1 : ty_e [] V2 (list Ty1)
============================
 ty_e [] V Ty
 < apply lookup_unique to LkpTy Ty1.

Subgoal 9.1:

Variables: EG TG' X V VHd GHd VTl GTl V2 Tl E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist X Tl E) ((X, V)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty1
Ev1 : eval_e EG E (cons V V2)
Ev2 : X = Tl -> false
Ev3 : select (X, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' X Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V Ty1
TyV1 : ty_e [] V2 (list Ty1)
============================
 ty_e [] V Ty1
 < search.

Subgoal 9.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : lookup ((Tl, V2)::GTl) X V
============================
 ty_e [] V Ty
 < LV: case LV1.

Subgoal 9.2.1:

Variables: EG TG' X Ty V VHd GHd VTl GTl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd X E) ((Hd, V1)::((X, V)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V)
Ev2 : Hd = X -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (X, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' X (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V (list Ty1)
LV : Hd = X -> false
============================
 ty_e [] V Ty
 < apply lookup_unique to Ty2 LkpTy.

Subgoal 9.2.1:

Variables: EG TG' X V VHd GHd VTl GTl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd X E) ((Hd, V1)::((X, V)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X (list Ty1)
Ev1 : eval_e EG E (cons V1 V)
Ev2 : Hd = X -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (X, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' X (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V (list Ty1)
LV : Hd = X -> false
============================
 ty_e [] V (list Ty1)
 < search.

Subgoal 9.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
============================
 ty_e [] V Ty
 < assert X = Tl -> false.

Subgoal 9.2.2.1:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
============================
 X = Tl -> false
 < intros E.

Subgoal 9.2.2.1:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
E : X = Tl
============================
 false
 < case E.

Subgoal 9.2.2.1:

Variables: EG TG' Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' Tl Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = Tl -> false
LV1 : Tl = Tl -> false
LV2 : lookup GTl Tl V
============================
 false
 < backchain LV1.

Subgoal 9.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
============================
 ty_e [] V Ty
 < assert X = Hd -> false.

Subgoal 9.2.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
============================
 X = Hd -> false
 < intros E.

Subgoal 9.2.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
E : X = Hd
============================
 false
 < case E.

Subgoal 9.2.2.2:

Variables: EG TG' Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' Hd Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = Hd -> false
LV1 : Tl = Hd -> false
LV2 : lookup GTl Hd V
H1 : Hd = Tl -> false
============================
 false
 < backchain LV.

Subgoal 9.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
H2 : X = Hd -> false
============================
 ty_e [] V Ty
 < L: apply lookup_after_select_before to LV2 Ev4 _.

Subgoal 9.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
H2 : X = Hd -> false
L : lookup GHd X V
============================
 ty_e [] V Ty
 < L': apply lookup_after_select_before to L Ev3 _.

Subgoal 9.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
H2 : X = Hd -> false
L : lookup GHd X V
L' : lookup EG X V
============================
 ty_e [] V Ty
 < apply Rel to _ L'.

Subgoal 9.2.2:

Variables: EG TG' X Ty V VHd GHd VTl GTl V2 Tl V1 Hd E Ty1
IH : forall TG EG S TG' EG' X Ty V,
       ty_s TG S TG' -> eval_s EG S EG' * -> (forall X1 Ty1 V1,
         lookup TG X1 Ty1 -> lookup EG X1 V1 -> ty_e [] V1 Ty1) -> lookup TG' X Ty ->
       lookup EG' X V -> ty_e [] V Ty
Ev : eval_s EG (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
Ev1 : eval_e EG E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd EG
Ev4 : select (Tl, VTl) GTl GHd
Ty : ty_e TG' E (list Ty1)
Ty1 : lookup TG' Hd Ty1
Ty2 : lookup TG' Tl (list Ty1)
TyV : ty_e [] V1 Ty1
TyV1 : ty_e [] V2 (list Ty1)
LV : Hd = X -> false
LV1 : Tl = X -> false
LV2 : lookup GTl X V
H1 : X = Tl -> false
H2 : X = Hd -> false
L : lookup GHd X V
L' : lookup EG X V
H3 : ty_e [] V Ty
============================
 ty_e [] V Ty
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_eval_e.

Subgoal 1:

Variables: G E' V
Hyp : |{e}- null E' ~~> E'
Hyp1 : eval_e G (null E') V
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (null E')
============================
 exists V', eval_e G E' V'
 < case Hyp1.

Subgoal 1.1:

Variables: G E'
Hyp : |{e}- null E' ~~> E'
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (null E')
H1 : eval_e G E' nil
============================
 exists V', eval_e G E' V'
 < search.

Subgoal 1.2:

Variables: G E' V1 V2
Hyp : |{e}- null E' ~~> E'
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (null E')
H1 : eval_e G E' (cons V1 V2)
============================
 exists V', eval_e G E' V'
 < search.

Subgoal 2:

Variables: G E' V
Hyp : |{e}- head E' ~~> E'
Hyp1 : eval_e G (head E') V
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (head E')
============================
 exists V', eval_e G E' V'
 < case Hyp1.

Subgoal 2:

Variables: G E' V V2
Hyp : |{e}- head E' ~~> E'
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (head E')
H1 : eval_e G E' (cons V V2)
============================
 exists V', eval_e G E' V'
 < search.

Subgoal 3:

Variables: G E' V
Hyp : |{e}- tail E' ~~> E'
Hyp1 : eval_e G (tail E') V
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (tail E')
============================
 exists V', eval_e G E' V'
 < case Hyp1.

Subgoal 3:

Variables: G E' V V1
Hyp : |{e}- tail E' ~~> E'
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (tail E')
H1 : eval_e G E' (cons V1 V)
============================
 exists V', eval_e G E' V'
 < search.

Subgoal 4:

Variables: G V
Hyp : |{e}- nil ~~> trueE
Hyp1 : eval_e G nil V
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e nil
============================
 exists V', eval_e G trueE V'
 < search.

Subgoal 5:

Variables: G V E2 E1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp1 : eval_e G (cons E1 E2) V
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (cons E1 E2)
============================
 exists V', eval_e G (eq E1 E2) V'
 < case Hyp1.

Subgoal 5:

Variables: G E2 E1 V2 V1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
Hyp3 : is_e (cons E1 E2)
H1 : eval_e G E1 V1
H2 : eval_e G E2 V2
============================
 exists V', eval_e G (eq E1 E2) V'
 < case Hyp3.

Subgoal 5:

Variables: G E2 E1 V2 V1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
H1 : eval_e G E1 V1
H2 : eval_e G E2 V2
H3 : is_e E1
H4 : is_e E2
============================
 exists V', eval_e G (eq E1 E2) V'
 < Is1: apply eval_e_is to _ _ H1.

Subgoal 5:

Variables: G E2 E1 V2 V1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
H1 : eval_e G E1 V1
H2 : eval_e G E2 V2
H3 : is_e E1
H4 : is_e E2
Is1 : is_e V1
============================
 exists V', eval_e G (eq E1 E2) V'
 < Is2: apply eval_e_is to _ _ H2.

Subgoal 5:

Variables: G E2 E1 V2 V1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
H1 : eval_e G E1 V1
H2 : eval_e G E2 V2
H3 : is_e E1
H4 : is_e E2
Is1 : is_e V1
Is2 : is_e V2
============================
 exists V', eval_e G (eq E1 E2) V'
 < Or: apply is_e_eq_or_not to Is1 Is2.

Subgoal 5:

Variables: G E2 E1 V2 V1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
H1 : eval_e G E1 V1
H2 : eval_e G E2 V2
H3 : is_e E1
H4 : is_e E2
Is1 : is_e V1
Is2 : is_e V2
Or : V1 = V2 \/ (V1 = V2 -> false)
============================
 exists V', eval_e G (eq E1 E2) V'
 < E: case Or.

Subgoal 5.1:

Variables: G E2 E1 V2
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
H1 : eval_e G E1 V2
H2 : eval_e G E2 V2
H3 : is_e E1
H4 : is_e E2
Is1 : is_e V2
Is2 : is_e V2
============================
 exists V', eval_e G (eq E1 E2) V'
 < search.

Subgoal 5.2:

Variables: G E2 E1 V2 V1
Hyp : |{e}- cons E1 E2 ~~> eq E1 E2
Hyp2 : is_list (is_pair is_string is_e) G
H1 : eval_e G E1 V1
H2 : eval_e G E2 V2
H3 : is_e E1
H4 : is_e E2
Is1 : is_e V1
Is2 : is_e V2
E : V1 = V2 -> false
============================
 exists V', eval_e G (eq E1 E2) V'
 < search.

Proof completed.
 < Prove library:host:eval_e_unique.

Subgoal 12:

Variables: G V2
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G nil nil @
Ev2 : eval_e G nil V2
============================
 nil = V2
 < case Ev2.

Subgoal 12:

Variables: G
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G nil nil @
============================
 nil = nil
 < search.

Subgoal 13:

Variables: G V2 V4 V3 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (cons E1 E2) (cons V3 V4) @
Ev2 : eval_e G (cons E1 E2) V2
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
============================
 cons V3 V4 = V2
 < Ev2: case Ev2.

Subgoal 13:

Variables: G V4 V3 E2 E1 V6 V5
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (cons E1 E2) (cons V3 V4) @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev2 : eval_e G E1 V5
Ev5 : eval_e G E2 V6
============================
 cons V3 V4 = cons V5 V6
 < apply IH to Ev3 Ev2.

Subgoal 13:

Variables: G V4 E2 E1 V6 V5
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (cons E1 E2) (cons V5 V4) @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V4 *
Ev2 : eval_e G E1 V5
Ev5 : eval_e G E2 V6
============================
 cons V5 V4 = cons V5 V6
 < apply IH to Ev4 Ev5.

Subgoal 13:

Variables: G E2 E1 V6 V5
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (cons E1 E2) (cons V5 V6) @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V6 *
Ev2 : eval_e G E1 V5
Ev5 : eval_e G E2 V6
============================
 cons V5 V6 = cons V5 V6
 < search.

Subgoal 14:

Variables: G V2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (null E1) trueE @
Ev2 : eval_e G (null E1) V2
Ev3 : eval_e G E1 nil *
============================
 trueE = V2
 < Ev2: case Ev2.

Subgoal 14.1:

Variables: G E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (null E1) trueE @
Ev3 : eval_e G E1 nil *
Ev2 : eval_e G E1 nil
============================
 trueE = trueE
 < search.

Subgoal 14.2:

Variables: G E1 V3 V4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (null E1) trueE @
Ev3 : eval_e G E1 nil *
Ev2 : eval_e G E1 (cons V3 V4)
============================
 trueE = falseE
 < apply IH to Ev3 Ev2.

Subgoal 15:

Variables: G V2 V3 V4 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (null E1) falseE @
Ev2 : eval_e G (null E1) V2
Ev3 : eval_e G E1 (cons V3 V4) *
============================
 falseE = V2
 < Ev2: case Ev2.

Subgoal 15.1:

Variables: G V3 V4 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (null E1) falseE @
Ev3 : eval_e G E1 (cons V3 V4) *
Ev2 : eval_e G E1 nil
============================
 falseE = trueE
 < apply IH to Ev3 Ev2.

Subgoal 15.2:

Variables: G V3 V4 E1 V5 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (null E1) falseE @
Ev3 : eval_e G E1 (cons V3 V4) *
Ev2 : eval_e G E1 (cons V5 V6)
============================
 falseE = falseE
 < search.

Subgoal 16:

Variables: G V1 V2 V3 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (head E1) V1 @
Ev2 : eval_e G (head E1) V2
Ev3 : eval_e G E1 (cons V1 V3) *
============================
 V1 = V2
 < Ev2: case Ev2.

Subgoal 16:

Variables: G V1 V2 V3 E1 V4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (head E1) V1 @
Ev3 : eval_e G E1 (cons V1 V3) *
Ev2 : eval_e G E1 (cons V2 V4)
============================
 V1 = V2
 < apply IH to Ev3 Ev2.

Subgoal 16:

Variables: G V2 E1 V4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (head E1) V2 @
Ev3 : eval_e G E1 (cons V2 V4) *
Ev2 : eval_e G E1 (cons V2 V4)
============================
 V2 = V2
 < search.

Subgoal 17:

Variables: G V1 V2 V3 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (tail E1) V1 @
Ev2 : eval_e G (tail E1) V2
Ev3 : eval_e G E1 (cons V3 V1) *
============================
 V1 = V2
 < Ev2: case Ev2.

Subgoal 17:

Variables: G V1 V2 V3 E1 V4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (tail E1) V1 @
Ev3 : eval_e G E1 (cons V3 V1) *
Ev2 : eval_e G E1 (cons V4 V2)
============================
 V1 = V2
 < apply IH to Ev3 Ev2.

Subgoal 17:

Variables: G V2 E1 V4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (tail E1) V2 @
Ev3 : eval_e G E1 (cons V4 V2) *
Ev2 : eval_e G E1 (cons V4 V2)
============================
 V2 = V2
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_eval.

Variables: G G2 Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G2
Hyp2 : Hd = Tl -> false
============================
 exists G',
   eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G'
 < Ev: case Hyp1.

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 exists G',
   eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G'
 < exists (Hd, V1)::((Tl, V2)::GTl).

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) ((Hd, V1)::((Tl, V2)::GTl))
 < unfold .

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 exists G1,
   eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G1 /\
   eval_s G1 (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < exists (Tl, V2)::((Hd, cons V1 V2)::GTl).

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl)) /\
 eval_s ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < split.

Subgoal 1:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < unfold .

Subgoal 1:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 exists G1,
   eval_s G (assign Hd E) G1 /\
   eval_s G1 (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < exists (Hd, cons V1 V2)::GHd.

Subgoal 1:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s G (assign Hd E) ((Hd, cons V1 V2)::GHd) /\
 eval_s ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < split.

Subgoal 1.1:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s G (assign Hd E) ((Hd, cons V1 V2)::GHd)
 < search.

Subgoal 1.2:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < search.

Subgoal 2:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 eval_s ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < assert Tl = Hd -> false.

Subgoal 2.1:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
============================
 Tl = Hd -> false
 < intros E.

Subgoal 2.1:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
E : Tl = Hd
============================
 false
 < case E.

Subgoal 2.1:

Variables: G Hd E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Hd -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Hd -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Hd, VTl) GTl GHd
============================
 false
 < backchain Ev1.

Subgoal 2:

Variables: G Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : Hd = Tl -> false
Ev : eval_e G E (cons V1 V2)
Ev1 : Hd = Tl -> false
Ev2 : select (Hd, VHd) GHd G
Ev3 : select (Tl, VTl) GTl GHd
H1 : Tl = Hd -> false
============================
 eval_s ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < search.

Proof completed.
 < Add_Ext_Size library:host:eval_s.

Proof completed.
 < Add_Proj_Rel library:host:eval_s.

Proof completed.
 < Prove_Ext_Ind library:host:eval_s.

Subgoal 9:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
============================
 <eval_s {P}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl))
 < assert |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))).

Subgoal 9:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl))
 < unfold .

Subgoal 9:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 exists T VHd GHd VTl,
   (eval_e G E (cons V1 V2) /\
   ((Hd = Tl -> false) /\ (select (Hd, VHd) GHd G /\ select (Tl, VTl) GTl GHd))) /\
   (|{s}- splitlist Hd Tl E ~~> T /\
   <eval_s {P}> G T ((Hd, V1)::((Tl, V2)::GTl)))
 < exists seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))),
   VHd,
   GHd,
   VTl.

Subgoal 9:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 (eval_e G E (cons V1 V2) /\
 ((Hd = Tl -> false) /\ (select (Hd, VHd) GHd G /\ select (Tl, VTl) GTl GHd))) /\
 (|{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd))) /\
 <eval_s {P}> G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) ((Hd, V1)::((Tl, V2)::GTl)))
 < split.

Subgoal 9.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 eval_e G E (cons V1 V2)
 < search.

Subgoal 9.2:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 Hd = Tl -> false
 < search.

Subgoal 9.3:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 select (Hd, VHd) GHd G
 < search.

Subgoal 9.4:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 select (Tl, VTl) GTl GHd
 < search.

Subgoal 9.5:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
 < search.

Subgoal 9.6:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) ((Hd, V1)::((Tl, V2)::GTl))
 < unfold .

Subgoal 9.6:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 exists G1,
   <eval_s {P}> G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G1 /\
   <eval_s {P}> G1 (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < exists (Tl, V2)::((Hd, cons V1 V2)::GTl).

Subgoal 9.6:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl)) /\
 <eval_s {P}> ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < split.

Subgoal 9.6.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> G (seq (assign Hd E) (assign Tl (tail (var Hd)))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < unfold .

Subgoal 9.6.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 exists G1,
   <eval_s {P}> G (assign Hd E) G1 /\
   <eval_s {P}> G1 (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < exists (Hd, cons V1 V2)::GHd.

Subgoal 9.6.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> G (assign Hd E) ((Hd, cons V1 V2)::GHd) /\
 <eval_s {P}> ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < split.

Subgoal 9.6.1.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> G (assign Hd E) ((Hd, cons V1 V2)::GHd)
 < search.

Subgoal 9.6.1.2:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> ((Hd, cons V1 V2)::GHd) (assign Tl (tail (var Hd))) ((Tl, V2)::((Hd, cons V1 V2)::GTl))
 < search.

Subgoal 9.6.2:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 <eval_s {P}> ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < assert Tl = Hd -> false.

Subgoal 9.6.2.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 Tl = Hd -> false
 < intros E.

Subgoal 9.6.2.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
E : Tl = Hd
============================
 false
 < case E.

Subgoal 9.6.2.1:

Variables: G VHd GHd VTl GTl V2 V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Hd E) ((Hd, V1)::((Hd, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Hd -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Hd, VTl) GTl GHd
H1 : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd)))
============================
 false
 < backchain R2.

Subgoal 9.6.2:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall N G S G1, <eval_s {ES}> G S G1 N -> acc N * -> <eval_s {P}> G S G1
IH1 : forall N G S G1,
        <eval_s {ES}> G S G1 N ** -> acc N @ -> <eval_s {P}> G S G1
R : <eval_s {ES}> G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) 1 @@
Acc : acc 1 @
R1 : eval_e G E (cons V1 V2)
R2 : Hd = Tl -> false
R3 : select (Hd, VHd) GHd G
R4 : select (Tl, VTl) GTl GHd
H1 : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
H2 : Tl = Hd -> false
============================
 <eval_s {P}> ((Tl, V2)::((Hd, cons V1 V2)::GTl)) (assign Hd (head (var Hd))) ((Hd, V1)::((Tl, V2)::GTl))
 < search.

Proof completed.
 < Prove_Constraint library:host:proj_s_eval_results.

Variables: G G1 G2 X V Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp2 : eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G2
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
============================
 lookup G2 X V
 < EvTr: case Hyp2.

Variables: G G1 G2 X V Hd Tl E G3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G3
EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2
============================
 lookup G2 X V
 < EvTr: case EvTr.

Variables: G G1 G2 X V Hd Tl E G3 G4
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2
EvTr : eval_s G (assign Hd E) G4
EvTr2 : eval_s G4 (assign Tl (tail (var Hd))) G3
============================
 lookup G2 X V
 < EvTr: case EvTr.

Variables: G G1 G2 X V Hd Tl E G3 VOld NewG V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2
EvTr2 : eval_s ((Hd, V1)::NewG) (assign Tl (tail (var Hd))) G3
EvTr : eval_e G E V1
EvTr3 : select (Hd, VOld) NewG G
============================
 lookup G2 X V
 < EvTr: case EvTr2.

Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2
EvTr : eval_e G E V1
EvTr3 : select (Hd, VOld) NewG G
EvTr2 : eval_e ((Hd, V1)::NewG) (tail (var Hd)) V2
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG)
============================
 lookup G2 X V
 < EvTr: case EvTr2.

Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 V3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2
EvTr : eval_e G E V1
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG)
EvTr2 : eval_e ((Hd, V1)::NewG) (var Hd) (cons V3 V2)
============================
 lookup G2 X V
 < EvTr: case EvTr2.

Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 V3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2
EvTr : eval_e G E V1
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG)
EvTr2 : lookup ((Hd, V1)::NewG) Hd (cons V3 V2)
============================
 lookup G2 X V
 < case EvTr2.

Subgoal 1:

Variables: G G1 G2 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG)
============================
 lookup G2 X V
 < EvTr: case EvTr1.

Subgoal 1:

Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG)
EvTr1 : eval_e ((Tl, V2)::NewG1) (head (var Hd)) V4
EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1)
============================
 lookup ((Hd, V4)::NewG2) X V
 < EvTr: case EvTr1.

Subgoal 1:

Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 V5
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG)
EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1)
EvTr1 : eval_e ((Tl, V2)::NewG1) (var Hd) (cons V4 V5)
============================
 lookup ((Hd, V4)::NewG2) X V
 < EvTr: case EvTr1.

Subgoal 1:

Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 V5
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG)
EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1)
EvTr1 : lookup ((Tl, V2)::NewG1) Hd (cons V4 V5)
============================
 lookup ((Hd, V4)::NewG2) X V
 < L: case EvTr1.

Subgoal 1.1:

Variables: G G1 X V Hd E VOld NewG VOld1 NewG1 V3 VOld2 NewG2 V4 V5
Hyp : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Hd E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Hd -> false
EvTr : eval_e G E (cons V3 (cons V4 V5))
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Hd, VOld1) NewG1 ((Hd, cons V3 (cons V4 V5))::NewG)
EvTr2 : select (Hd, VOld2) NewG2 ((Hd, cons V4 V5)::NewG1)
============================
 lookup ((Hd, V4)::NewG2) X V
 < apply Hyp4 to _.

Subgoal 1.2:

Variables: G G1 X V Hd Tl E VOld NewG VOld1 NewG1 V2 V3 VOld2 NewG2 V4 V5
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, cons V3 V2)::NewG)
EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::NewG1)
L : Tl = Hd -> false
L1 : lookup NewG1 Hd (cons V4 V5)
============================
 lookup ((Hd, V4)::NewG2) X V
 < STl: case EvTr4.

Subgoal 1.2.1:

Variables: G G1 X V Hd E VOld NewG V2 V3 VOld2 NewG2 V4 V5
Hyp : |{s}- splitlist Hd Hd E ~~> seq (seq (assign Hd E) (assign Hd (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Hd E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Hd -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr2 : select (Hd, VOld2) NewG2 ((Hd, V2)::NewG)
L : Hd = Hd -> false
L1 : lookup NewG Hd (cons V4 V5)
============================
 lookup ((Hd, V4)::NewG2) X V
 < apply L to _.

Subgoal 1.2.2:

Variables: G G1 X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 NewG2 V4 V5 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
EvTr2 : select (Hd, VOld2) NewG2 ((Tl, V2)::((Hd, cons V3 V2)::L1))
L : Tl = Hd -> false
L1 : lookup ((Hd, cons V3 V2)::L1) Hd (cons V4 V5)
STl : select (Tl, VOld1) L1 NewG
============================
 lookup ((Hd, V4)::NewG2) X V
 < SHd: case EvTr2.

Subgoal 1.2.2.1:

Variables: G G1 X V Tl E VOld NewG VOld1 V2 V3 V4 V5 L1
Hyp : |{s}- splitlist Tl Tl E ~~> seq (seq (assign Tl E) (assign Tl (tail (var Tl)))) (assign Tl (head (var Tl)))
Hyp1 : eval_s G (splitlist Tl Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Tl = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Tl, VOld) NewG G
L : Tl = Tl -> false
L1 : lookup ((Tl, cons V3 V2)::L1) Tl (cons V4 V5)
STl : select (Tl, VOld1) L1 NewG
============================
 lookup ((Tl, V4)::((Tl, cons V3 V2)::L1)) X V
 < apply L to _.

Subgoal 1.2.2.2:

Variables: G G1 X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 V4 V5 L1 L2
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
L1 : lookup ((Hd, cons V3 V2)::L1) Hd (cons V4 V5)
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V3 V2)::L1)
============================
 lookup ((Hd, V4)::((Tl, V2)::L2)) X V
 < EvSL: case Hyp1.

Subgoal 1.2.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 V4 V5 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
L1 : lookup ((Hd, cons V3 V2)::L1) Hd (cons V4 V5)
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V3 V2)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
============================
 lookup ((Hd, V4)::((Tl, V2)::L2)) X V
 < case L1.

Subgoal 1.2.2.2.1:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 V4 V5 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V4 V5)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V4 V5)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
============================
 lookup ((Hd, V4)::((Tl, V5)::L2)) X V
 < apply eval_e_unique to EvTr EvSL.

Subgoal 1.2.2.2.1:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < LX: case Hyp3.

Subgoal 1.2.2.2.1.1:

Variables: G X V Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvTr : eval_e G E (cons V V7)
EvTr3 : select (X, VOld) NewG G
L : Tl = X -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (X, VOld2) L2 ((X, cons V V7)::L1)
EvSL : eval_e G E (cons V V7)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
============================
 lookup ((X, V)::((Tl, V7)::L2)) X V
 < search.

Subgoal 1.2.2.2.1.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : lookup ((Tl, V7)::GTl) X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < LX: case LX1.

Subgoal 1.2.2.2.1.2.1:

Variables: G X V Hd E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V6
Hyp : |{s}- splitlist Hd X E ~~> seq (seq (assign Hd E) (assign X (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = X -> false
EvTr : eval_e G E (cons V6 V)
EvTr3 : select (Hd, VOld) NewG G
L : X = Hd -> false
STl : select (X, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V)::L1)
EvSL : eval_e G E (cons V6 V)
EvSL1 : Hd = X -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (X, VTl) GTl GHd
LX : Hd = X -> false
============================
 lookup ((Hd, V6)::((X, V)::L2)) X V
 < search.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < assert X = Tl -> false.

Subgoal 1.2.2.2.1.2.2.1:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
============================
 X = Tl -> false
 < intros E.

Subgoal 1.2.2.2.1.2.2.1:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
E : X = Tl
============================
 false
 < case E.

Subgoal 1.2.2.2.1.2.2.1:

Variables: G V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = Tl -> false
LX1 : Tl = Tl -> false
LX2 : lookup GTl Tl V
============================
 false
 < backchain LX1.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < L2: apply lookup_after_select_before to LX2 EvSL3 _.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < assert X = Hd -> false.

Subgoal 1.2.2.2.1.2.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
============================
 X = Hd -> false
 < intros E.

Subgoal 1.2.2.2.1.2.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
E : X = Hd
============================
 false
 < case E.

Subgoal 1.2.2.2.1.2.2.2:

Variables: G V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = Hd -> false
LX1 : Tl = Hd -> false
LX2 : lookup GTl Hd V
H1 : Hd = Tl -> false
L2 : lookup GHd Hd V
============================
 false
 < backchain LX.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
H2 : X = Hd -> false
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < L3: apply lookup_after_select_before to L2 EvSL2 _.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
H2 : X = Hd -> false
L3 : lookup G X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < L4: apply select_lookup to L3 EvTr3 _.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
H2 : X = Hd -> false
L3 : lookup G X V
L4 : lookup NewG X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < L5: apply select_lookup to L4 STl _.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
H2 : X = Hd -> false
L3 : lookup G X V
L4 : lookup NewG X V
L5 : lookup L1 X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < L5': assert lookup ((Hd, cons V6 V7)::L1) X V.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
H2 : X = Hd -> false
L3 : lookup G X V
L4 : lookup NewG X V
L5 : lookup L1 X V
L5' : lookup ((Hd, cons V6 V7)::L1) X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < apply select_lookup to L5' SHd _.

Subgoal 1.2.2.2.1.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 VOld2 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V6 V7)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V6 V7)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup GTl X V
H1 : X = Tl -> false
L2 : lookup GHd X V
H2 : X = Hd -> false
L3 : lookup G X V
L4 : lookup NewG X V
L5 : lookup L1 X V
L5' : lookup ((Hd, cons V6 V7)::L1) X V
H3 : lookup L2 X V
============================
 lookup ((Hd, V6)::((Tl, V7)::L2)) X V
 < search.

Subgoal 1.2.2.2.2:

Variables: G X V Hd Tl E VOld NewG VOld1 V2 V3 VOld2 V4 V5 L1 L2 VHd GHd VTl GTl V7 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V6)::((Tl, V7)::GTl)) X V
Hyp4 : Hd = Tl -> false
EvTr : eval_e G E (cons V3 V2)
EvTr3 : select (Hd, VOld) NewG G
L : Tl = Hd -> false
STl : select (Tl, VOld1) L1 NewG
SHd : select (Hd, VOld2) L2 ((Hd, cons V3 V2)::L1)
EvSL : eval_e G E (cons V6 V7)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
H1 : Hd = Hd -> false
H2 : lookup L1 Hd (cons V4 V5)
============================
 lookup ((Hd, V4)::((Tl, V2)::L2)) X V
 < apply H1 to _.

Subgoal 2:

Variables: G G1 G2 X V Hd Tl E VOld NewG V1 VOld1 NewG1 V2 V3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp3 : lookup G1 X V
Hyp4 : Hd = Tl -> false
EvTr1 : eval_s ((Tl, V2)::NewG1) (assign Hd (head (var Hd))) G2
EvTr : eval_e G E V1
EvTr3 : select (Hd, VOld) NewG G
EvTr4 : select (Tl, VOld1) NewG1 ((Hd, V1)::NewG)
H1 : Hd = Hd -> false
H2 : lookup NewG Hd (cons V3 V2)
============================
 lookup G2 X V
 < apply H1 to _.

Proof completed.
 < Prove_Constraint library:host:proj_s_eval_results_back.

Variables: G G1 G2 X V Hd Tl E
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp1 : eval_s G (splitlist Hd Tl E) G1
Hyp2 : eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G2
Hyp3 : lookup G2 X V
Hyp4 : Hd = Tl -> false
============================
 lookup G1 X V
 < EvSL: case Hyp1.

Variables: G G2 X V Hd Tl E VHd GHd VTl GTl V2 V1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp2 : eval_s G (seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))) G2
Hyp3 : lookup G2 X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case Hyp2.

Variables: G G2 X V Hd Tl E VHd GHd VTl GTl V2 V1 G3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup G2 X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_s G (seq (assign Hd E) (assign Tl (tail (var Hd)))) G3
EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr.

Variables: G G2 X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 G4
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup G2 X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr1 : eval_s G3 (assign Hd (head (var Hd))) G2
EvTr : eval_s G (assign Hd E) G4
EvTr2 : eval_s G4 (assign Tl (tail (var Hd))) G3
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr1.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 G4 VOld NewG V3
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_s G (assign Hd E) G4
EvTr2 : eval_s G4 (assign Tl (tail (var Hd))) G3
EvTr1 : eval_e G3 (head (var Hd)) V3
EvTr3 : select (Hd, VOld) NewG G3
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 VOld NewG V3 VOld1 NewG1 V4
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr2 : eval_s ((Hd, V4)::NewG1) (assign Tl (tail (var Hd))) G3
EvTr1 : eval_e G3 (head (var Hd)) V3
EvTr3 : select (Hd, VOld) NewG G3
EvTr : eval_e G E V4
EvTr4 : select (Hd, VOld1) NewG1 G
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < apply eval_e_unique to EvTr EvSL.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 G3 VOld NewG V3 VOld1 NewG1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr2 : eval_s ((Hd, cons V1 V2)::NewG1) (assign Tl (tail (var Hd))) G3
EvTr1 : eval_e G3 (head (var Hd)) V3
EvTr3 : select (Hd, VOld) NewG G3
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr2.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr1 : eval_e ((Tl, V5)::NewG2) (head (var Hd)) V3
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (tail (var Hd)) V5
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1)
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr1.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (tail (var Hd)) V5
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1)
EvTr1 : eval_e ((Tl, V5)::NewG2) (var Hd) (cons V3 V6)
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr2.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1)
EvTr1 : eval_e ((Tl, V5)::NewG2) (var Hd) (cons V3 V6)
EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (var Hd) (cons V7 V5)
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr1.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1)
EvTr2 : eval_e ((Hd, cons V1 V2)::NewG1) (var Hd) (cons V7 V5)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < EvTr: case EvTr2.

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : lookup ((Hd, cons V1 V2)::NewG1) Hd (cons V7 V5)
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < LHd: case EvTr2.

Subgoal 1:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < EvTr: case EvTr3.

Subgoal 1.1:

Variables: G X V Tl E VHd GHd VTl GTl V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7
Hyp : |{s}- splitlist Tl Tl E ~~> seq (seq (assign Tl E) (assign Tl (tail (var Tl)))) (assign Tl (head (var Tl)))
Hyp3 : lookup ((Tl, V3)::NewG2) X V
Hyp4 : Tl = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Tl = Tl -> false
EvSL2 : select (Tl, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Tl, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Tl, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Tl (cons V3 V6)
============================
 lookup ((Tl, V7)::((Tl, V5)::GTl)) X V
 < apply EvSL1 to _.

Subgoal 1.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::((Tl, V5)::L1)) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < LX: case Hyp3.

Subgoal 1.2.1:

Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (X, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((X, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) X (cons V V6)
EvTr2 : select (X, VOld) L1 NewG2
============================
 lookup ((X, V7)::((Tl, V5)::GTl)) X V
 < STl: case EvTr5.

Subgoal 1.2.1.1:

Variables: G X V E VHd GHd VTl GTl VOld VOld1 NewG1 V5 V6 V7 L1
Hyp : |{s}- splitlist X X E ~~> seq (seq (assign X E) (assign X (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = X -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : X = X -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (X, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (X, VOld1) NewG1 G
EvTr1 : lookup ((X, V5)::NewG1) X (cons V V6)
EvTr2 : select (X, VOld) L1 NewG1
============================
 lookup ((X, V7)::((X, V5)::GTl)) X V
 < apply EvSL1 to _.

Subgoal 1.2.1.2:

Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V5 V6 V7 L1 L2
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (X, VOld1) NewG1 G
EvTr1 : lookup ((Tl, V5)::((X, cons V7 V5)::L2)) X (cons V V6)
EvTr2 : select (X, VOld) L1 ((X, cons V7 V5)::L2)
STl : select (Tl, VOld2) L2 NewG1
============================
 lookup ((X, V7)::((Tl, V5)::GTl)) X V
 < L: case EvTr1.

Subgoal 1.2.1.2.1:

Variables: G X V E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V6 V7 L1 L2
Hyp : |{s}- splitlist X X E ~~> seq (seq (assign X E) (assign X (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = X -> false
EvSL : eval_e G E (cons V7 (cons V V6))
EvSL1 : X = X -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (X, VTl) GTl GHd
EvTr : eval_e G E (cons V7 (cons V V6))
EvTr4 : select (X, VOld1) NewG1 G
EvTr2 : select (X, VOld) L1 ((X, cons V7 (cons V V6))::L2)
STl : select (X, VOld2) L2 NewG1
============================
 lookup ((X, V7)::((X, cons V V6)::GTl)) X V
 < apply EvSL1 to _.

Subgoal 1.2.1.2.2:

Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V5 V6 V7 L1 L2
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (X, VOld1) NewG1 G
EvTr2 : select (X, VOld) L1 ((X, cons V7 V5)::L2)
STl : select (Tl, VOld2) L2 NewG1
L : Tl = X -> false
L1 : lookup ((X, cons V7 V5)::L2) X (cons V V6)
============================
 lookup ((X, V7)::((Tl, V5)::GTl)) X V
 < L': case L1.

Subgoal 1.2.1.2.2.1:

Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V6 L1 L2
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvSL : eval_e G E (cons V V6)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V V6)
EvTr4 : select (X, VOld1) NewG1 G
EvTr2 : select (X, VOld) L1 ((X, cons V V6)::L2)
STl : select (Tl, VOld2) L2 NewG1
L : Tl = X -> false
============================
 lookup ((X, V)::((Tl, V6)::GTl)) X V
 < search.

Subgoal 1.2.1.2.2.2:

Variables: G X V Tl E VHd GHd VTl GTl VOld VOld1 NewG1 VOld2 V5 V6 V7 L1 L2
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (X, VOld1) NewG1 G
EvTr2 : select (X, VOld) L1 ((X, cons V7 V5)::L2)
STl : select (Tl, VOld2) L2 NewG1
L : Tl = X -> false
L' : X = X -> false
L'1 : lookup L2 X (cons V V6)
============================
 lookup ((X, V7)::((Tl, V5)::GTl)) X V
 < apply L' to _.

Subgoal 1.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : lookup ((Tl, V5)::L1) X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < LX: case LX1.

Subgoal 1.2.2.1:

Variables: G X V Hd E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V6 V7 L1
Hyp : |{s}- splitlist Hd X E ~~> seq (seq (assign Hd E) (assign X (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = X -> false
EvSL : eval_e G E (cons V7 V)
EvSL1 : Hd = X -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (X, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (X, VOld2) NewG2 ((Hd, cons V7 V)::NewG1)
EvTr1 : lookup ((X, V)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
============================
 lookup ((Hd, V7)::((X, V)::GTl)) X V
 < search.

Subgoal 1.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < assert X = Hd -> false.

Subgoal 1.2.2.2.1:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
============================
 X = Hd -> false
 < intros E.

Subgoal 1.2.2.2.1:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
E : X = Hd
============================
 false
 < case E.

Subgoal 1.2.2.2.1:

Variables: G V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = Hd -> false
LX1 : Tl = Hd -> false
LX2 : lookup L1 Hd V
============================
 false
 < backchain LX.

Subgoal 1.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < assert X = Tl -> false.

Subgoal 1.2.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
============================
 X = Tl -> false
 < intros E.

Subgoal 1.2.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
E : X = Tl
============================
 false
 < case E.

Subgoal 1.2.2.2.2:

Variables: G V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = Tl -> false
LX1 : Tl = Tl -> false
LX2 : lookup L1 Tl V
H1 : Tl = Hd -> false
============================
 false
 < backchain LX1.

Subgoal 1.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < L1: apply lookup_after_select_before to LX2 EvTr2 _.

Subgoal 1.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < L2: apply lookup_after_select_before to L1 EvTr5 _.

Subgoal 1.2.2.2:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X V
L2 : lookup ((Hd, cons V7 V5)::NewG1) X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < L': case L2.

Subgoal 1.2.2.2.3:

Variables: G X Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist X Tl E ~~> seq (seq (assign X E) (assign Tl (tail (var X)))) (assign X (head (var X)))
Hyp4 : X = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : X = Tl -> false
EvSL2 : select (X, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (X, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((X, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) X (cons V3 V6)
EvTr2 : select (X, VOld) L1 NewG2
LX : X = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X (cons V7 V5)
H1 : X = X -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X (cons V7 V5)
============================
 lookup ((X, V7)::((Tl, V5)::GTl)) X (cons V7 V5)
 < apply LX to _.

Subgoal 1.2.2.2.4:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X V
L' : Hd = X -> false
L'1 : lookup NewG1 X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < L3: apply lookup_after_select_before to L'1 EvTr4 _.

Subgoal 1.2.2.2.4:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X V
L' : Hd = X -> false
L'1 : lookup NewG1 X V
L3 : lookup G X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < L4: apply select_lookup to L3 EvSL2 _.

Subgoal 1.2.2.2.4:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X V
L' : Hd = X -> false
L'1 : lookup NewG1 X V
L3 : lookup G X V
L4 : lookup GHd X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < apply select_lookup to L4 EvSL3 _.

Subgoal 1.2.2.2.4:

Variables: G X V Hd Tl E VHd GHd VTl GTl VOld V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7 L1
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V7 V5)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr : eval_e G E (cons V7 V5)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V7 V5)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
EvTr2 : select (Hd, VOld) L1 NewG2
LX : Hd = X -> false
LX1 : Tl = X -> false
LX2 : lookup L1 X V
H1 : X = Hd -> false
H2 : X = Tl -> false
L1 : lookup NewG2 X V
L' : Hd = X -> false
L'1 : lookup NewG1 X V
L3 : lookup G X V
L4 : lookup GHd X V
H3 : lookup GTl X V
============================
 lookup ((Hd, V7)::((Tl, V5)::GTl)) X V
 < search.

Subgoal 2:

Variables: G X V Hd Tl E VHd GHd VTl GTl V2 V1 VOld NewG V3 VOld1 NewG1 VOld2 NewG2 V5 V6 V7
Hyp : |{s}- splitlist Hd Tl E ~~> seq (seq (assign Hd E) (assign Tl (tail (var Hd)))) (assign Hd (head (var Hd)))
Hyp3 : lookup ((Hd, V3)::NewG) X V
Hyp4 : Hd = Tl -> false
EvSL : eval_e G E (cons V1 V2)
EvSL1 : Hd = Tl -> false
EvSL2 : select (Hd, VHd) GHd G
EvSL3 : select (Tl, VTl) GTl GHd
EvTr3 : select (Hd, VOld) NewG ((Tl, V5)::NewG2)
EvTr : eval_e G E (cons V1 V2)
EvTr4 : select (Hd, VOld1) NewG1 G
EvTr5 : select (Tl, VOld2) NewG2 ((Hd, cons V1 V2)::NewG1)
EvTr1 : lookup ((Tl, V5)::NewG2) Hd (cons V3 V6)
LHd : Hd = Hd -> false
LHd1 : lookup NewG1 Hd (cons V7 V5)
============================
 lookup ((Hd, V1)::((Tl, V2)::GTl)) X V
 < apply LHd to _.

Proof completed.
 < Prove library:host:eval_e_value.

Subgoal 12:

Variables: G
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G nil nil @
AllVal : forall X XV, mem (X, XV) G -> value XV
============================
 value nil
 < search.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
============================
 value (cons V1 V2)
 < apply IH to Ev1 AllVal.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
H1 : value V1
============================
 value (cons V1 V2)
 < apply IH to Ev2 AllVal.

Subgoal 13:

Variables: G V2 V1 E2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (cons E1 E2) (cons V1 V2) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
H1 : value V1
H2 : value V2
============================
 value (cons V1 V2)
 < search.

Subgoal 14:

Variables: G E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (null E1) trueE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 nil *
============================
 value trueE
 < search.

Subgoal 15:

Variables: G V1 V2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (null E1) falseE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V1 V2) *
============================
 value falseE
 < search.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (head E1) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V V2) *
============================
 value V
 < V: apply IH to Ev1 AllVal.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (head E1) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V V2) *
V : value (cons V V2)
============================
 value V
 < case V.

Subgoal 16:

Variables: G V V2 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (head E1) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V V2) *
H1 : value V
H2 : value V2
============================
 value V
 < search.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (tail E1) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V1 V) *
============================
 value V
 < V: apply IH to Ev1 AllVal.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (tail E1) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V1 V) *
V : value (cons V1 V)
============================
 value V
 < case V.

Subgoal 17:

Variables: G V V1 E1
IH : forall G E V,
       eval_e G E V * -> (forall X XV, mem (X, XV) G -> value XV) -> value V
Ev : eval_e G (tail E1) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (cons V1 V) *
H1 : value V1
H2 : value V
============================
 value V
 < search.

Proof completed.
 < Prove library:host:eval_s_value.

Subgoal 9:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((Hd, V1)::((Tl, V2)::GTl))
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
============================
 value YV
 < VCons: apply eval_e_value to Ev1 AllVal.

Subgoal 9:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((Hd, V1)::((Tl, V2)::GTl))
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
============================
 value YV
 < V: case VCons (keep).

Subgoal 9:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((Hd, V1)::((Tl, V2)::GTl))
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
============================
 value YV
 < M: case Mem.

Subgoal 9.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
============================
 value V1
 < search.

Subgoal 9.2:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
M : mem (Y, YV) ((Tl, V2)::GTl)
============================
 value YV
 < M: case M.

Subgoal 9.2.1:

Variables: G VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
============================
 value V2
 < search.

Subgoal 9.2.2:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
M : mem (Y, YV) GTl
============================
 value YV
 < MGHd: apply mem_after_select_before to _ M.

Subgoal 9.2.2:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
M : mem (Y, YV) GTl
MGHd : mem (Y, YV) GHd
============================
 value YV
 < apply mem_after_select_before to _ MGHd.

Subgoal 9.2.2:

Variables: G Y YV VHd GHd VTl GTl V2 Tl V1 Hd E
IH : forall G S G' Y YV,
       eval_s G S G' * -> (forall X XV, mem (X, XV) G -> value XV) -> mem (Y, YV) G' ->
       value YV
Ev : eval_s G (splitlist Hd Tl E) ((Hd, V1)::((Tl, V2)::GTl)) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E (cons V1 V2)
Ev2 : Hd = Tl -> false
Ev3 : select (Hd, VHd) GHd G
Ev4 : select (Tl, VTl) GTl GHd
VCons : value (cons V1 V2)
V : value V1
V1 : value V2
M : mem (Y, YV) GTl
MGHd : mem (Y, YV) GHd
H1 : mem (Y, YV) G
============================
 value YV
 < backchain AllVal.

Proof completed.
 < Prove library:host:vars_eval_same_result.

Subgoal 12:

Variables: G1 G2 D V2
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars nil D
Ev1 : eval_e G1 nil nil @
Ev2 : eval_e G2 nil V2
============================
 nil = V2
 < case Ev2.

Subgoal 12:

Variables: G1 G2 D
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars nil D
Ev1 : eval_e G1 nil nil @
============================
 nil = nil
 < search.

Subgoal 13:

Variables: G1 G2 D V2 V4 V3 E2 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (cons E1 E2) D
Ev1 : eval_e G1 (cons E1 E2) (cons V3 V4) @
Ev2 : eval_e G2 (cons E1 E2) V2
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
============================
 cons V3 V4 = V2
 < Ev2: case Ev2.

Subgoal 13:

Variables: G1 G2 D V4 V3 E2 E1 V6 V5
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (cons E1 E2) D
Ev1 : eval_e G1 (cons E1 E2) (cons V3 V4) @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
============================
 cons V3 V4 = cons V5 V6
 < Vars: case Vars.

Subgoal 13:

Variables: G1 G2 D V4 V3 E2 E1 V6 V5 Vr1 Vr2
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (cons E1 E2) (cons V3 V4) @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
 cons V3 V4 = cons V5 V6
 < apply IH to _ Vars Ev3 Ev2.

Subgoal 13.1:

Variables: G1 G2 D V4 V3 E2 E1 V6 V5 Vr1 Vr2
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (cons E1 E2) (cons V3 V4) @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
 forall X U1 U2, mem X Vr1 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
 < backchain vars_equiv_left.

Subgoal 13:

Variables: G1 G2 D V4 E2 E1 V6 V5 Vr1 Vr2
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (cons E1 E2) (cons V5 V4) @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
 cons V5 V4 = cons V5 V6
 < apply IH to _ Vars1 Ev4 Ev5.

Subgoal 13.2:

Variables: G1 G2 D V4 E2 E1 V6 V5 Vr1 Vr2
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (cons E1 E2) (cons V5 V4) @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
 forall X U1 U2, mem X Vr2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
 < backchain vars_equiv_right.

Subgoal 13:

Variables: G1 G2 D E2 E1 V6 V5 Vr1 Vr2
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (cons E1 E2) (cons V5 V6) @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V6 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
 cons V5 V6 = cons V5 V6
 < search.

Subgoal 14:

Variables: G1 G2 D V2 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (null E1) D
Ev1 : eval_e G1 (null E1) trueE @
Ev2 : eval_e G2 (null E1) V2
Ev3 : eval_e G1 E1 nil *
============================
 trueE = V2
 < Ev2: case Ev2.

Subgoal 14.1:

Variables: G1 G2 D E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (null E1) D
Ev1 : eval_e G1 (null E1) trueE @
Ev3 : eval_e G1 E1 nil *
Ev2 : eval_e G2 E1 nil
============================
 trueE = trueE
 < search.

Subgoal 14.2:

Variables: G1 G2 D E1 V3 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (null E1) D
Ev1 : eval_e G1 (null E1) trueE @
Ev3 : eval_e G1 E1 nil *
Ev2 : eval_e G2 E1 (cons V3 V4)
============================
 trueE = falseE
 < Vars: case Vars.

Subgoal 14.2:

Variables: G1 G2 D E1 V3 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (null E1) trueE @
Ev3 : eval_e G1 E1 nil *
Ev2 : eval_e G2 E1 (cons V3 V4)
Vars : vars E1 D
============================
 trueE = falseE
 < apply IH to _ Vars Ev3 Ev2.

Subgoal 15:

Variables: G1 G2 D V2 V3 V4 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (null E1) D
Ev1 : eval_e G1 (null E1) falseE @
Ev2 : eval_e G2 (null E1) V2
Ev3 : eval_e G1 E1 (cons V3 V4) *
============================
 falseE = V2
 < Ev2: case Ev2.

Subgoal 15.1:

Variables: G1 G2 D V3 V4 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (null E1) D
Ev1 : eval_e G1 (null E1) falseE @
Ev3 : eval_e G1 E1 (cons V3 V4) *
Ev2 : eval_e G2 E1 nil
============================
 falseE = trueE
 < Vars: case Vars.

Subgoal 15.1:

Variables: G1 G2 D V3 V4 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (null E1) falseE @
Ev3 : eval_e G1 E1 (cons V3 V4) *
Ev2 : eval_e G2 E1 nil
Vars : vars E1 D
============================
 falseE = trueE
 < apply IH to _ Vars Ev3 Ev2.

Subgoal 15.2:

Variables: G1 G2 D V3 V4 E1 V5 V6
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (null E1) D
Ev1 : eval_e G1 (null E1) falseE @
Ev3 : eval_e G1 E1 (cons V3 V4) *
Ev2 : eval_e G2 E1 (cons V5 V6)
============================
 falseE = falseE
 < search.

Subgoal 16:

Variables: G1 G2 D V1 V2 V3 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (head E1) D
Ev1 : eval_e G1 (head E1) V1 @
Ev2 : eval_e G2 (head E1) V2
Ev3 : eval_e G1 E1 (cons V1 V3) *
============================
 V1 = V2
 < Ev2: case Ev2.

Subgoal 16:

Variables: G1 G2 D V1 V2 V3 E1 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (head E1) D
Ev1 : eval_e G1 (head E1) V1 @
Ev3 : eval_e G1 E1 (cons V1 V3) *
Ev2 : eval_e G2 E1 (cons V2 V4)
============================
 V1 = V2
 < Vars: case Vars.

Subgoal 16:

Variables: G1 G2 D V1 V2 V3 E1 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (head E1) V1 @
Ev3 : eval_e G1 E1 (cons V1 V3) *
Ev2 : eval_e G2 E1 (cons V2 V4)
Vars : vars E1 D
============================
 V1 = V2
 < apply IH to _ _ Ev3 Ev2.

Subgoal 16:

Variables: G1 G2 D V2 E1 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (head E1) V2 @
Ev3 : eval_e G1 E1 (cons V2 V4) *
Ev2 : eval_e G2 E1 (cons V2 V4)
Vars : vars E1 D
============================
 V2 = V2
 < search.

Subgoal 17:

Variables: G1 G2 D V1 V2 V3 E1
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (tail E1) D
Ev1 : eval_e G1 (tail E1) V1 @
Ev2 : eval_e G2 (tail E1) V2
Ev3 : eval_e G1 E1 (cons V3 V1) *
============================
 V1 = V2
 < Ev2: case Ev2.

Subgoal 17:

Variables: G1 G2 D V1 V2 V3 E1 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (tail E1) D
Ev1 : eval_e G1 (tail E1) V1 @
Ev3 : eval_e G1 E1 (cons V3 V1) *
Ev2 : eval_e G2 E1 (cons V4 V2)
============================
 V1 = V2
 < Vars: case Vars.

Subgoal 17:

Variables: G1 G2 D V1 V2 V3 E1 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (tail E1) V1 @
Ev3 : eval_e G1 E1 (cons V3 V1) *
Ev2 : eval_e G2 E1 (cons V4 V2)
Vars : vars E1 D
============================
 V1 = V2
 < apply IH to _ _ Ev3 Ev2.

Subgoal 17:

Variables: G1 G2 D V2 E1 V4
IH : forall G1 G2 E D V1 V2,
       (forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
       vars E D -> eval_e G1 E V1 * -> eval_e G2 E V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (tail E1) V2 @
Ev3 : eval_e G1 E1 (cons V4 V2) *
Ev2 : eval_e G2 E1 (cons V4 V2)
Vars : vars E1 D
============================
 V2 = V2
 < search.

Proof completed.
Back to example home