< Module library:host.
< Projection_Constraint proj_e_unique :
forall E E1 E2,
|{e}- E ~~> E1 -> |{e}- E ~~> E2 -> E1 = E2.
Proof completed.
< Projection_Constraint proj_e_is :
forall E E',
|{e}- E ~~> E' -> is_e E -> is_e E'.
Proof completed.
< Projection_Constraint proj_s_unique :
forall S S1 S2,
|{s}- S ~~> S1 -> |{s}- S ~~> S2 -> S1 = S2.
Proof completed.
< Projection_Constraint proj_s_is :
forall S S',
|{s}- S ~~> S' -> is_s S -> is_s S'.
Proof completed.
< Projection_Constraint proj_ty_unique :
forall Ty Ty1 Ty2,
|{ty}- Ty ~~> Ty1 -> |{ty}- Ty ~~> Ty2 -> Ty1 = Ty2.
Proof completed.
< Projection_Constraint proj_ty_is :
forall Ty Ty',
|{ty}- Ty ~~> Ty' -> is_ty Ty -> is_ty Ty'.
Proof completed.
< Proj_Rel is_e E.
Proof completed.
< Ext_Ind forall E, is_e E.
Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 1:
Variables: S
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (var S) @
R1 : is_string S
============================
<is_e {P}> (var S)
< search.
Subgoal 2:
Variables: I
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (intlit I) @
R1 : is_integer I
============================
<is_e {P}> (intlit I)
< search.
Subgoal 3:
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e trueE @
============================
<is_e {P}> trueE
< search.
Subgoal 4:
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e falseE @
============================
<is_e {P}> falseE
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (add E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
============================
<is_e {P}> (add E1 E2)
< apply IH to R1.
Subgoal 5:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (add E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
============================
<is_e {P}> (add E1 E2)
< apply IH to R2.
Subgoal 5:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (add E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
H2 : <is_e {P}> E2
============================
<is_e {P}> (add E1 E2)
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (eq E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
============================
<is_e {P}> (eq E1 E2)
< apply IH to R1.
Subgoal 6:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (eq E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
============================
<is_e {P}> (eq E1 E2)
< apply IH to R2.
Subgoal 6:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (eq E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
H2 : <is_e {P}> E2
============================
<is_e {P}> (eq E1 E2)
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (gt E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
============================
<is_e {P}> (gt E1 E2)
< apply IH to R1.
Subgoal 7:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (gt E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
============================
<is_e {P}> (gt E1 E2)
< apply IH to R2.
Subgoal 7:
Variables: E2 E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (gt E1 E2) @
R1 : is_e E1 *
R2 : is_e E2 *
H1 : <is_e {P}> E1
H2 : <is_e {P}> E2
============================
<is_e {P}> (gt E1 E2)
< search.
Subgoal 8:
Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (not E1) @
R1 : is_e E1 *
============================
<is_e {P}> (not E1)
< apply IH to R1.
Subgoal 8:
Variables: E1
IH : forall E, is_e E * -> <is_e {P}> E
R : is_e (not E1) @
R1 : is_e E1 *
H1 : <is_e {P}> E1
============================
<is_e {P}> (not E1)
< search.
Proof completed.
< Extensible_Theorem
is_e_var_or_not : forall E,
IsE : is_e E ->
(exists N, E = var N) \/
((exists N, E = var N) -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
(exists N, var S = var N) \/ ((exists N, var S = var N) -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
(exists N, intlit I = var N) \/ ((exists N, intlit I = var N) -> false)
< search.
Subgoal 3:
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e trueE @
============================
(exists N, trueE = var N) \/ ((exists N, trueE = var N) -> false)
< search.
Subgoal 4:
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e falseE @
============================
(exists N, falseE = var N) \/ ((exists N, falseE = var N) -> false)
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists N, add E1 E2 = var N) \/ ((exists N, add E1 E2 = var N) -> false)
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists N, eq E1 E2 = var N) \/ ((exists N, eq E1 E2 = var N) -> false)
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists N, gt E1 E2 = var N) \/ ((exists N, gt E1 E2 = var N) -> false)
< search.
Subgoal 8:
Variables: E1
IH : forall E,
is_e E * -> (exists N, E = var N) \/ ((exists N, E = var N) -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
(exists N, not E1 = var N) \/ ((exists N, not E1 = var N) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_intlit_or_not : forall E,
IsE : is_e E ->
(exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
(exists I, var S = intlit I) \/ ((exists I, var S = intlit I) -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
(exists I1, intlit I = intlit I1) \/
((exists I1, intlit I = intlit I1) -> false)
< search.
Subgoal 3:
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e trueE @
============================
(exists I, trueE = intlit I) \/ ((exists I, trueE = intlit I) -> false)
< search.
Subgoal 4:
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e falseE @
============================
(exists I, falseE = intlit I) \/ ((exists I, falseE = intlit I) -> false)
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists I, add E1 E2 = intlit I) \/ ((exists I, add E1 E2 = intlit I) -> false)
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists I, eq E1 E2 = intlit I) \/ ((exists I, eq E1 E2 = intlit I) -> false)
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists I, gt E1 E2 = intlit I) \/ ((exists I, gt E1 E2 = intlit I) -> false)
< search.
Subgoal 8:
Variables: E1
IH : forall E,
is_e E * -> (exists I, E = intlit I) \/
((exists I, E = intlit I) -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
(exists I, not E1 = intlit I) \/ ((exists I, not E1 = intlit I) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_trueE_or_not : forall E,
IsE : is_e E ->
E = trueE \/
(E = trueE -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
var S = trueE \/ (var S = trueE -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
intlit I = trueE \/ (intlit I = trueE -> false)
< search.
Subgoal 3:
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e trueE @
============================
trueE = trueE \/ (trueE = trueE -> false)
< search.
Subgoal 4:
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e falseE @
============================
falseE = trueE \/ (falseE = trueE -> false)
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
add E1 E2 = trueE \/ (add E1 E2 = trueE -> false)
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
eq E1 E2 = trueE \/ (eq E1 E2 = trueE -> false)
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
gt E1 E2 = trueE \/ (gt E1 E2 = trueE -> false)
< search.
Subgoal 8:
Variables: E1
IH : forall E, is_e E * -> E = trueE \/ (E = trueE -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
not E1 = trueE \/ (not E1 = trueE -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_falseE_or_not : forall E,
IsE : is_e E ->
E = falseE \/
(E = falseE -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
var S = falseE \/ (var S = falseE -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
intlit I = falseE \/ (intlit I = falseE -> false)
< search.
Subgoal 3:
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e trueE @
============================
trueE = falseE \/ (trueE = falseE -> false)
< search.
Subgoal 4:
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e falseE @
============================
falseE = falseE \/ (falseE = falseE -> false)
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
add E1 E2 = falseE \/ (add E1 E2 = falseE -> false)
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
eq E1 E2 = falseE \/ (eq E1 E2 = falseE -> false)
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
gt E1 E2 = falseE \/ (gt E1 E2 = falseE -> false)
< search.
Subgoal 8:
Variables: E1
IH : forall E, is_e E * -> E = falseE \/ (E = falseE -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
not E1 = falseE \/ (not E1 = falseE -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_add_or_not : forall E,
IsE : is_e E ->
(exists E1 E2, E = add E1 E2) \/
((exists E1 E2, E = add E1 E2) -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E,
is_e E * -> (exists E1 E2, E = add E1 E2) \/
((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
(exists E1 E2, var S = add E1 E2) \/
((exists E1 E2, var S = add E1 E2) -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E,
is_e E * -> (exists E1 E2, E = add E1 E2) \/
((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
(exists E1 E2, intlit I = add E1 E2) \/
((exists E1 E2, intlit I = add E1 E2) -> false)
< search.
Subgoal 3:
IH : forall E,
is_e E * -> (exists E1 E2, E = add E1 E2) \/
((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e trueE @
============================
(exists E1 E2, trueE = add E1 E2) \/
((exists E1 E2, trueE = add E1 E2) -> false)
< search.
Subgoal 4:
IH : forall E,
is_e E * -> (exists E1 E2, E = add E1 E2) \/
((exists E1 E2, E = add E1 E2) -> false)
IsE : is_e falseE @
============================
(exists E1 E2, falseE = add E1 E2) \/
((exists E1 E2, falseE = add E1 E2) -> false)
< search.
Subgoal 5:
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 (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, add E1 E2 = add E3 E4) \/
((exists E3 E4, add E1 E2 = add E3 E4) -> false)
< search.
Subgoal 6:
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 (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, eq E1 E2 = add E3 E4) \/
((exists E3 E4, eq E1 E2 = add E3 E4) -> false)
< search.
Subgoal 7:
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 (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, gt E1 E2 = add E3 E4) \/
((exists E3 E4, gt E1 E2 = add E3 E4) -> false)
< search.
Subgoal 8:
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 (not E1) @
IsE1 : is_e E1 *
============================
(exists E2 E3, not E1 = add E2 E3) \/
((exists E2 E3, not E1 = add E2 E3) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_eqC_or_not : forall E,
IsE : is_e E ->
(exists E1 E2, E = eq E1 E2) \/
((exists E1 E2, E = eq E1 E2) -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E,
is_e E * -> (exists E1 E2, E = eq E1 E2) \/
((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
(exists E1 E2, var S = eq E1 E2) \/ ((exists E1 E2, var S = eq E1 E2) -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E,
is_e E * -> (exists E1 E2, E = eq E1 E2) \/
((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
(exists E1 E2, intlit I = eq E1 E2) \/
((exists E1 E2, intlit I = eq E1 E2) -> false)
< search.
Subgoal 3:
IH : forall E,
is_e E * -> (exists E1 E2, E = eq E1 E2) \/
((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e trueE @
============================
(exists E1 E2, trueE = eq E1 E2) \/ ((exists E1 E2, trueE = eq E1 E2) -> false)
< search.
Subgoal 4:
IH : forall E,
is_e E * -> (exists E1 E2, E = eq E1 E2) \/
((exists E1 E2, E = eq E1 E2) -> false)
IsE : is_e falseE @
============================
(exists E1 E2, falseE = eq E1 E2) \/
((exists E1 E2, falseE = eq E1 E2) -> false)
< search.
Subgoal 5:
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 (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, add E1 E2 = eq E3 E4) \/
((exists E3 E4, add E1 E2 = eq E3 E4) -> false)
< search.
Subgoal 6:
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 (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, eq E1 E2 = eq E3 E4) \/
((exists E3 E4, eq E1 E2 = eq E3 E4) -> false)
< search.
Subgoal 7:
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 (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, gt E1 E2 = eq E3 E4) \/
((exists E3 E4, gt E1 E2 = eq E3 E4) -> false)
< search.
Subgoal 8:
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 (not E1) @
IsE1 : is_e E1 *
============================
(exists E2 E3, not E1 = eq E2 E3) \/
((exists E2 E3, not E1 = eq E2 E3) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_gt_or_not : forall E,
IsE : is_e E ->
(exists E1 E2, E = gt E1 E2) \/
((exists E1 E2, E = gt E1 E2) -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E,
is_e E * -> (exists E1 E2, E = gt E1 E2) \/
((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
(exists E1 E2, var S = gt E1 E2) \/ ((exists E1 E2, var S = gt E1 E2) -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E,
is_e E * -> (exists E1 E2, E = gt E1 E2) \/
((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
(exists E1 E2, intlit I = gt E1 E2) \/
((exists E1 E2, intlit I = gt E1 E2) -> false)
< search.
Subgoal 3:
IH : forall E,
is_e E * -> (exists E1 E2, E = gt E1 E2) \/
((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e trueE @
============================
(exists E1 E2, trueE = gt E1 E2) \/ ((exists E1 E2, trueE = gt E1 E2) -> false)
< search.
Subgoal 4:
IH : forall E,
is_e E * -> (exists E1 E2, E = gt E1 E2) \/
((exists E1 E2, E = gt E1 E2) -> false)
IsE : is_e falseE @
============================
(exists E1 E2, falseE = gt E1 E2) \/
((exists E1 E2, falseE = gt E1 E2) -> false)
< search.
Subgoal 5:
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 (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, add E1 E2 = gt E3 E4) \/
((exists E3 E4, add E1 E2 = gt E3 E4) -> false)
< search.
Subgoal 6:
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 (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, eq E1 E2 = gt E3 E4) \/
((exists E3 E4, eq E1 E2 = gt E3 E4) -> false)
< search.
Subgoal 7:
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 (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E3 E4, gt E1 E2 = gt E3 E4) \/
((exists E3 E4, gt E1 E2 = gt E3 E4) -> false)
< search.
Subgoal 8:
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 (not E1) @
IsE1 : is_e E1 *
============================
(exists E2 E3, not E1 = gt E2 E3) \/
((exists E2 E3, not E1 = gt E2 E3) -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_not_or_not : forall E,
IsE : is_e E ->
(exists E', E = not E') \/
((exists E', E = not E') -> false)
on IsE.
Subgoal 1:
Variables: S
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (var S) @
IsE1 : is_string S
============================
(exists E', var S = not E') \/ ((exists E', var S = not E') -> false)
< search.
Subgoal 2:
Variables: I
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
(exists E', intlit I = not E') \/ ((exists E', intlit I = not E') -> false)
< search.
Subgoal 3:
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e trueE @
============================
(exists E', trueE = not E') \/ ((exists E', trueE = not E') -> false)
< search.
Subgoal 4:
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e falseE @
============================
(exists E', falseE = not E') \/ ((exists E', falseE = not E') -> false)
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E', add E1 E2 = not E') \/ ((exists E', add E1 E2 = not E') -> false)
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E', eq E1 E2 = not E') \/ ((exists E', eq E1 E2 = not E') -> false)
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
(exists E', gt E1 E2 = not E') \/ ((exists E', gt E1 E2 = not E') -> false)
< search.
Subgoal 8:
Variables: E1
IH : forall E,
is_e E * -> (exists E', E = not E') \/ ((exists E', E = not E') -> false)
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
(exists E', not E1 = not E') \/ ((exists E', not E1 = not E') -> false)
< search.
Proof completed.
< Extensible_Theorem
is_e_eq_or_not : forall E1 E2,
IsE1 : is_e E1 ->
IsE2 : is_e E2 ->
E1 = E2 \/
(E1 = E2 -> false)
on IsE1.
Subgoal 1:
Variables: E2 S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e E2
IsE3 : is_string S
============================
var S = E2 \/ (var S = E2 -> false)
< Or: apply is_e_var_or_not to IsE2.
Subgoal 1:
Variables: E2 S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e E2
IsE3 : is_string S
Or : (exists N, E2 = var N) \/ ((exists N, E2 = var N) -> false)
============================
var S = E2 \/ (var S = E2 -> false)
< E: case Or.
Subgoal 1.1:
Variables: S N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e (var N)
IsE3 : is_string S
============================
var S = var N \/ (var S = var N -> false)
< Is: case IsE2.
Subgoal 1.1:
Variables: S N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE3 : is_string S
Is : is_string N
============================
var S = var N \/ (var S = var N -> false)
< Or: apply is_string_eq_or_not to IsE3 Is.
Subgoal 1.1:
Variables: S N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE3 : is_string S
Is : is_string N
Or : S = N \/ (S = N -> false)
============================
var S = var N \/ (var S = var N -> false)
< E: case Or.
Subgoal 1.1.1:
Variables: N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var N) @
IsE3 : is_string N
Is : is_string N
============================
var N = var N \/ (var N = var N -> false)
< search.
Subgoal 1.1.2:
Variables: S N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE3 : is_string S
Is : is_string N
E : S = N -> false
============================
var S = var N \/ (var S = var N -> false)
< right.
Subgoal 1.1.2:
Variables: S N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE3 : is_string S
Is : is_string N
E : S = N -> false
============================
var S = var N -> false
< intros Eq.
Subgoal 1.1.2:
Variables: S N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE3 : is_string S
Is : is_string N
E : S = N -> false
Eq : var S = var N
============================
false
< case Eq.
Subgoal 1.1.2:
Variables: N
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var N) @
IsE3 : is_string N
Is : is_string N
E : N = N -> false
============================
false
< backchain E.
Subgoal 1.2:
Variables: E2 S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e E2
IsE3 : is_string S
E : (exists N, E2 = var N) -> false
============================
var S = E2 \/ (var S = E2 -> false)
< right.
Subgoal 1.2:
Variables: E2 S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e E2
IsE3 : is_string S
E : (exists N, E2 = var N) -> false
============================
var S = E2 -> false
< intros Eq.
Subgoal 1.2:
Variables: E2 S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e E2
IsE3 : is_string S
E : (exists N, E2 = var N) -> false
Eq : var S = E2
============================
false
< backchain E.
Subgoal 1.2:
Variables: E2 S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e E2
IsE3 : is_string S
E : (exists N, E2 = var N) -> false
Eq : var S = E2
============================
exists N, E2 = var N
< case Eq.
Subgoal 1.2:
Variables: S
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (var S) @
IsE2 : is_e (var S)
IsE3 : is_string S
E : (exists N, var S = var N) -> false
============================
exists N, var S = var N
< search.
Subgoal 2:
Variables: E2 I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e E2
IsE3 : is_integer I
============================
intlit I = E2 \/ (intlit I = E2 -> false)
< Or: apply is_e_intlit_or_not to IsE2.
Subgoal 2:
Variables: E2 I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e E2
IsE3 : is_integer I
Or : (exists I, E2 = intlit I) \/ ((exists I, E2 = intlit I) -> false)
============================
intlit I = E2 \/ (intlit I = E2 -> false)
< E: case Or.
Subgoal 2.1:
Variables: I I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e (intlit I1)
IsE3 : is_integer I
============================
intlit I = intlit I1 \/ (intlit I = intlit I1 -> false)
< Is: case IsE2.
Subgoal 2.1:
Variables: I I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE3 : is_integer I
Is : is_integer I1
============================
intlit I = intlit I1 \/ (intlit I = intlit I1 -> false)
< Or: apply is_integer_eq_or_not to IsE3 Is.
Subgoal 2.1:
Variables: I I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE3 : is_integer I
Is : is_integer I1
Or : I = I1 \/ (I = I1 -> false)
============================
intlit I = intlit I1 \/ (intlit I = intlit I1 -> false)
< E: case Or.
Subgoal 2.1.1:
Variables: I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I1) @
IsE3 : is_integer I1
Is : is_integer I1
============================
intlit I1 = intlit I1 \/ (intlit I1 = intlit I1 -> false)
< search.
Subgoal 2.1.2:
Variables: I I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE3 : is_integer I
Is : is_integer I1
E : I = I1 -> false
============================
intlit I = intlit I1 \/ (intlit I = intlit I1 -> false)
< right.
Subgoal 2.1.2:
Variables: I I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE3 : is_integer I
Is : is_integer I1
E : I = I1 -> false
============================
intlit I = intlit I1 -> false
< intros Eq.
Subgoal 2.1.2:
Variables: I I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE3 : is_integer I
Is : is_integer I1
E : I = I1 -> false
Eq : intlit I = intlit I1
============================
false
< case Eq.
Subgoal 2.1.2:
Variables: I1
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I1) @
IsE3 : is_integer I1
Is : is_integer I1
E : I1 = I1 -> false
============================
false
< backchain E.
Subgoal 2.2:
Variables: E2 I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e E2
IsE3 : is_integer I
E : (exists I, E2 = intlit I) -> false
============================
intlit I = E2 \/ (intlit I = E2 -> false)
< right.
Subgoal 2.2:
Variables: E2 I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e E2
IsE3 : is_integer I
E : (exists I, E2 = intlit I) -> false
============================
intlit I = E2 -> false
< intros Eq.
Subgoal 2.2:
Variables: E2 I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e E2
IsE3 : is_integer I
E : (exists I, E2 = intlit I) -> false
Eq : intlit I = E2
============================
false
< backchain E.
Subgoal 2.2:
Variables: E2 I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e E2
IsE3 : is_integer I
E : (exists I, E2 = intlit I) -> false
Eq : intlit I = E2
============================
exists I, E2 = intlit I
< case Eq.
Subgoal 2.2:
Variables: I
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (intlit I) @
IsE2 : is_e (intlit I)
IsE3 : is_integer I
E : (exists I1, intlit I = intlit I1) -> false
============================
exists I1, intlit I = intlit I1
< search.
Subgoal 3:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e E2
============================
trueE = E2 \/ (trueE = E2 -> false)
< Or: apply is_e_trueE_or_not to IsE2.
Subgoal 3:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e E2
Or : E2 = trueE \/ (E2 = trueE -> false)
============================
trueE = E2 \/ (trueE = E2 -> false)
< E: case Or.
Subgoal 3.1:
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e trueE
============================
trueE = trueE \/ (trueE = trueE -> false)
< search.
Subgoal 3.2:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e E2
E : E2 = trueE -> false
============================
trueE = E2 \/ (trueE = E2 -> false)
< right.
Subgoal 3.2:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e E2
E : E2 = trueE -> false
============================
trueE = E2 -> false
< intros Eq.
Subgoal 3.2:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e E2
E : E2 = trueE -> false
Eq : trueE = E2
============================
false
< case Eq.
Subgoal 3.2:
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e trueE @
IsE2 : is_e trueE
E : trueE = trueE -> false
============================
false
< backchain E.
Subgoal 4:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e E2
============================
falseE = E2 \/ (falseE = E2 -> false)
< Or: apply is_e_falseE_or_not to IsE2.
Subgoal 4:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e E2
Or : E2 = falseE \/ (E2 = falseE -> false)
============================
falseE = E2 \/ (falseE = E2 -> false)
< E: case Or.
Subgoal 4.1:
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e falseE
============================
falseE = falseE \/ (falseE = falseE -> false)
< search.
Subgoal 4.2:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e E2
E : E2 = falseE -> false
============================
falseE = E2 \/ (falseE = E2 -> false)
< right.
Subgoal 4.2:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e E2
E : E2 = falseE -> false
============================
falseE = E2 -> false
< intros Eq.
Subgoal 4.2:
Variables: E2
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e E2
E : E2 = falseE -> false
Eq : falseE = E2
============================
false
< case Eq.
Subgoal 4.2:
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e falseE @
IsE2 : is_e falseE
E : falseE = falseE -> false
============================
false
< backchain E.
Subgoal 5:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
add E3 E = E2 \/ (add E3 E = E2 -> false)
< Or: apply is_e_add_or_not to IsE2.
Subgoal 5:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
Or : (exists E1 E3, E2 = add E1 E3) \/ ((exists E1 E3, E2 = add E1 E3) -> false)
============================
add E3 E = E2 \/ (add E3 E = E2 -> false)
< E: case Or.
Subgoal 5.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e (add E4 E5)
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
add E3 E = add E4 E5 \/ (add E3 E = add E4 E5 -> false)
< Is: case IsE2.
Subgoal 5.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
add E3 E = add E4 E5 \/ (add E3 E = add E4 E5 -> false)
< Or: apply IH to IsE3 Is.
Subgoal 5.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E3 = E4 \/ (E3 = E4 -> false)
============================
add E3 E = add E4 E5 \/ (add E3 E = add E4 E5 -> false)
< E: case Or.
Subgoal 5.1.1:
Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
add E4 E = add E4 E5 \/ (add E4 E = add E4 E5 -> false)
< Or: apply IH to IsE4 Is1.
Subgoal 5.1.1:
Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E = E5 \/ (E = E5 -> false)
============================
add E4 E = add E4 E5 \/ (add E4 E = add E4 E5 -> false)
< E: case Or.
Subgoal 5.1.1.1:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E4 E5) @
IsE3 : is_e E4 *
IsE4 : is_e E5 *
Is : is_e E4
Is1 : is_e E5
============================
add E4 E5 = add E4 E5 \/ (add E4 E5 = add E4 E5 -> false)
< search.
Subgoal 5.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 (add E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
add E4 E = add E4 E5 \/ (add E4 E = add E4 E5 -> false)
< right.
Subgoal 5.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 (add E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
add E4 E = add E4 E5 -> false
< intros Eq.
Subgoal 5.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 (add E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
Eq : add E4 E = add E4 E5
============================
false
< case Eq.
Subgoal 5.1.1.2:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add 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 5.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 (add E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
add E3 E = add E4 E5 \/ (add E3 E = add E4 E5 -> false)
< right.
Subgoal 5.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 (add E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
add E3 E = add E4 E5 -> false
< intros Eq.
Subgoal 5.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 (add E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
Eq : add E3 E = add E4 E5
============================
false
< case Eq.
Subgoal 5.1.2:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add 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 5.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = add E1 E3) -> false
============================
add E3 E = E2 \/ (add E3 E = E2 -> false)
< right.
Subgoal 5.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = add E1 E3) -> false
============================
add E3 E = E2 -> false
< intros Eq.
Subgoal 5.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = add E1 E3) -> false
Eq : add E3 E = E2
============================
false
< backchain E.
Subgoal 5.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = add E1 E3) -> false
Eq : add E3 E = E2
============================
exists E1 E3, E2 = add E1 E3
< case Eq.
Subgoal 5.2:
Variables: E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (add E3 E) @
IsE2 : is_e (add E3 E)
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E2, add E3 E = add E1 E2) -> false
============================
exists E1 E2, add E3 E = add E1 E2
< search.
Subgoal 6:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
eq E3 E = E2 \/ (eq E3 E = E2 -> false)
< Or: apply is_e_eqC_or_not to IsE2.
Subgoal 6:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
Or : (exists E1 E3, E2 = eq E1 E3) \/ ((exists E1 E3, E2 = eq E1 E3) -> false)
============================
eq E3 E = E2 \/ (eq E3 E = E2 -> false)
< E: case Or.
Subgoal 6.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e (eq E4 E5)
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
eq E3 E = eq E4 E5 \/ (eq E3 E = eq E4 E5 -> false)
< Is: case IsE2.
Subgoal 6.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
eq E3 E = eq E4 E5 \/ (eq E3 E = eq E4 E5 -> false)
< Or: apply IH to IsE3 Is.
Subgoal 6.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E3 = E4 \/ (E3 = E4 -> false)
============================
eq E3 E = eq E4 E5 \/ (eq E3 E = eq E4 E5 -> false)
< E: case Or.
Subgoal 6.1.1:
Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
eq E4 E = eq E4 E5 \/ (eq E4 E = eq E4 E5 -> false)
< Or: apply IH to IsE4 Is1.
Subgoal 6.1.1:
Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E = E5 \/ (E = E5 -> false)
============================
eq E4 E = eq E4 E5 \/ (eq E4 E = eq E4 E5 -> false)
< E: case Or.
Subgoal 6.1.1.1:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E4 E5) @
IsE3 : is_e E4 *
IsE4 : is_e E5 *
Is : is_e E4
Is1 : is_e E5
============================
eq E4 E5 = eq E4 E5 \/ (eq E4 E5 = eq E4 E5 -> false)
< search.
Subgoal 6.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 (eq E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
eq E4 E = eq E4 E5 \/ (eq E4 E = eq E4 E5 -> false)
< right.
Subgoal 6.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 (eq E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
eq E4 E = eq E4 E5 -> false
< intros Eq.
Subgoal 6.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 (eq E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
Eq : eq E4 E = eq E4 E5
============================
false
< case Eq.
Subgoal 6.1.1.2:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq 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 6.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 (eq E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
eq E3 E = eq E4 E5 \/ (eq E3 E = eq E4 E5 -> false)
< right.
Subgoal 6.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 (eq E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
eq E3 E = eq E4 E5 -> false
< intros Eq.
Subgoal 6.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 (eq E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
Eq : eq E3 E = eq E4 E5
============================
false
< case Eq.
Subgoal 6.1.2:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq 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 6.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = eq E1 E3) -> false
============================
eq E3 E = E2 \/ (eq E3 E = E2 -> false)
< right.
Subgoal 6.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = eq E1 E3) -> false
============================
eq E3 E = E2 -> false
< intros Eq.
Subgoal 6.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = eq E1 E3) -> false
Eq : eq E3 E = E2
============================
false
< backchain E.
Subgoal 6.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = eq E1 E3) -> false
Eq : eq E3 E = E2
============================
exists E1 E3, E2 = eq E1 E3
< case Eq.
Subgoal 6.2:
Variables: E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (eq E3 E) @
IsE2 : is_e (eq E3 E)
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E2, eq E3 E = eq E1 E2) -> false
============================
exists E1 E2, eq E3 E = eq E1 E2
< search.
Subgoal 7:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
gt E3 E = E2 \/ (gt E3 E = E2 -> false)
< Or: apply is_e_gt_or_not to IsE2.
Subgoal 7:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
Or : (exists E1 E3, E2 = gt E1 E3) \/ ((exists E1 E3, E2 = gt E1 E3) -> false)
============================
gt E3 E = E2 \/ (gt E3 E = E2 -> false)
< E: case Or.
Subgoal 7.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e (gt E4 E5)
IsE3 : is_e E3 *
IsE4 : is_e E *
============================
gt E3 E = gt E4 E5 \/ (gt E3 E = gt E4 E5 -> false)
< Is: case IsE2.
Subgoal 7.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
gt E3 E = gt E4 E5 \/ (gt E3 E = gt E4 E5 -> false)
< Or: apply IH to IsE3 Is.
Subgoal 7.1:
Variables: E E3 E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E3 = E4 \/ (E3 = E4 -> false)
============================
gt E3 E = gt E4 E5 \/ (gt E3 E = gt E4 E5 -> false)
< E: case Or.
Subgoal 7.1.1:
Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
============================
gt E4 E = gt E4 E5 \/ (gt E4 E = gt E4 E5 -> false)
< Or: apply IH to IsE4 Is1.
Subgoal 7.1.1:
Variables: E E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
Or : E = E5 \/ (E = E5 -> false)
============================
gt E4 E = gt E4 E5 \/ (gt E4 E = gt E4 E5 -> false)
< E: case Or.
Subgoal 7.1.1.1:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E4 E5) @
IsE3 : is_e E4 *
IsE4 : is_e E5 *
Is : is_e E4
Is1 : is_e E5
============================
gt E4 E5 = gt E4 E5 \/ (gt E4 E5 = gt E4 E5 -> false)
< search.
Subgoal 7.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 (gt E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
gt E4 E = gt E4 E5 \/ (gt E4 E = gt E4 E5 -> false)
< right.
Subgoal 7.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 (gt E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
============================
gt E4 E = gt E4 E5 -> false
< intros Eq.
Subgoal 7.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 (gt E4 E) @
IsE3 : is_e E4 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E = E5 -> false
Eq : gt E4 E = gt E4 E5
============================
false
< case Eq.
Subgoal 7.1.1.2:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt 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 7.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 (gt E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
gt E3 E = gt E4 E5 \/ (gt E3 E = gt E4 E5 -> false)
< right.
Subgoal 7.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 (gt E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
============================
gt E3 E = gt E4 E5 -> false
< intros Eq.
Subgoal 7.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 (gt E3 E) @
IsE3 : is_e E3 *
IsE4 : is_e E *
Is : is_e E4
Is1 : is_e E5
E : E3 = E4 -> false
Eq : gt E3 E = gt E4 E5
============================
false
< case Eq.
Subgoal 7.1.2:
Variables: E4 E5
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt 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 7.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = gt E1 E3) -> false
============================
gt E3 E = E2 \/ (gt E3 E = E2 -> false)
< right.
Subgoal 7.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = gt E1 E3) -> false
============================
gt E3 E = E2 -> false
< intros Eq.
Subgoal 7.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = gt E1 E3) -> false
Eq : gt E3 E = E2
============================
false
< backchain E.
Subgoal 7.2:
Variables: E2 E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e E2
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E3, E2 = gt E1 E3) -> false
Eq : gt E3 E = E2
============================
exists E1 E3, E2 = gt E1 E3
< case Eq.
Subgoal 7.2:
Variables: E E3
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (gt E3 E) @
IsE2 : is_e (gt E3 E)
IsE3 : is_e E3 *
IsE4 : is_e E *
E : (exists E1 E2, gt E3 E = gt E1 E2) -> false
============================
exists E1 E2, gt E3 E = gt E1 E2
< search.
Subgoal 8:
Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e E2
IsE3 : is_e E *
============================
not E = E2 \/ (not E = E2 -> false)
< Or: apply is_e_not_or_not to IsE2.
Subgoal 8:
Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e E2
IsE3 : is_e E *
Or : (exists E', E2 = not E') \/ ((exists E', E2 = not E') -> false)
============================
not E = E2 \/ (not E = E2 -> false)
< E: case Or.
Subgoal 8.1:
Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e (not E')
IsE3 : is_e E *
============================
not E = not E' \/ (not E = not E' -> false)
< Is: case IsE2.
Subgoal 8.1:
Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE3 : is_e E *
Is : is_e E'
============================
not E = not E' \/ (not E = not E' -> false)
< Or: apply IH to IsE3 Is.
Subgoal 8.1:
Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE3 : is_e E *
Is : is_e E'
Or : E = E' \/ (E = E' -> false)
============================
not E = not E' \/ (not E = not E' -> false)
< E: case Or.
Subgoal 8.1.1:
Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E') @
IsE3 : is_e E' *
Is : is_e E'
============================
not E' = not E' \/ (not E' = not E' -> false)
< search.
Subgoal 8.1.2:
Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
not E = not E' \/ (not E = not E' -> false)
< right.
Subgoal 8.1.2:
Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
============================
not E = not E' -> false
< intros Eq.
Subgoal 8.1.2:
Variables: E E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE3 : is_e E *
Is : is_e E'
E : E = E' -> false
Eq : not E = not E'
============================
false
< case Eq.
Subgoal 8.1.2:
Variables: E'
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E') @
IsE3 : is_e E' *
Is : is_e E'
E : E' = E' -> false
============================
false
< backchain E.
Subgoal 8.2:
Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = not E') -> false
============================
not E = E2 \/ (not E = E2 -> false)
< right.
Subgoal 8.2:
Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = not E') -> false
============================
not E = E2 -> false
< intros Eq.
Subgoal 8.2:
Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = not E') -> false
Eq : not E = E2
============================
false
< backchain E.
Subgoal 8.2:
Variables: E2 E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e E2
IsE3 : is_e E *
E : (exists E', E2 = not E') -> false
Eq : not E = E2
============================
exists E', E2 = not E'
< case Eq.
Subgoal 8.2:
Variables: E
IH : forall E1 E2, is_e E1 * -> is_e E2 -> E1 = E2 \/ (E1 = E2 -> false)
IsE1 : is_e (not E) @
IsE2 : is_e (not E)
IsE3 : is_e E *
E : (exists E', not E = not E') -> false
============================
exists E', not E = not E'
< search.
Proof completed.
< Extensible_Theorem
vars_unique : forall E V1 V2,
Vars1 : vars E V1 ->
Vars2 : vars E V2 ->
V1 = V2
on Vars1.
Subgoal 1:
Variables: V2 N
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (var N) [N] @
Vars2 : vars (var N) V2
============================
[N] = V2
< case Vars2.
Subgoal 1:
Variables: N
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (var N) [N] @
============================
[N] = [N]
< search.
Subgoal 2:
Variables: V2 I
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (intlit I) [] @
Vars2 : vars (intlit I) V2
============================
[] = V2
< case Vars2.
Subgoal 2:
Variables: I
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (intlit I) [] @
============================
[] = []
< search.
Subgoal 3:
Variables: V2
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars trueE [] @
Vars2 : vars trueE V2
============================
[] = V2
< case Vars2.
Subgoal 3:
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars trueE [] @
============================
[] = []
< search.
Subgoal 4:
Variables: V2
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars falseE [] @
Vars2 : vars falseE V2
============================
[] = V2
< case Vars2.
Subgoal 4:
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars falseE [] @
============================
[] = []
< search.
Subgoal 5:
Variables: V1 V2 Vr1 Vr2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (add E1 E2) V1 @
Vars2 : vars (add E1 E2) V2
Vars3 : vars E1 Vr1 *
Vars4 : vars E2 Vr2 *
Vars5 : Vr1 ++ Vr2 = V1
============================
V1 = V2
< V: case Vars2.
Subgoal 5:
Variables: V1 V2 Vr1 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (add 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 5:
Variables: V1 V2 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (add 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 5:
Variables: V1 V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (add 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 5:
Variables: V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (add 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 6:
Variables: V1 V2 Vr1 Vr2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (eq E1 E2) V1 @
Vars2 : vars (eq E1 E2) V2
Vars3 : vars E1 Vr1 *
Vars4 : vars E2 Vr2 *
Vars5 : Vr1 ++ Vr2 = V1
============================
V1 = V2
< V: case Vars2.
Subgoal 6:
Variables: V1 V2 Vr1 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (eq 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 6:
Variables: V1 V2 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (eq 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 6:
Variables: V1 V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (eq 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 6:
Variables: V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (eq 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 7:
Variables: V1 V2 Vr1 Vr2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (gt E1 E2) V1 @
Vars2 : vars (gt E1 E2) V2
Vars3 : vars E1 Vr1 *
Vars4 : vars E2 Vr2 *
Vars5 : Vr1 ++ Vr2 = V1
============================
V1 = V2
< V: case Vars2.
Subgoal 7:
Variables: V1 V2 Vr1 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (gt 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 7:
Variables: V1 V2 Vr2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (gt 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 7:
Variables: V1 V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (gt 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 7:
Variables: V2 E2 E1 Vr3 Vr4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (gt 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 8:
Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (not E1) V1 @
Vars2 : vars (not E1) V2
Vars3 : vars E1 V1 *
============================
V1 = V2
< V: case Vars2.
Subgoal 8:
Variables: V1 V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (not E1) V1 @
Vars3 : vars E1 V1 *
V : vars E1 V2
============================
V1 = V2
< apply IH to Vars3 V.
Subgoal 8:
Variables: V2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
Vars1 : vars (not E1) V2 @
Vars3 : vars E1 V2 *
V : vars E1 V2
============================
V2 = V2
< search.
Proof completed.
< Projection_Constraint proj_e_vars_exist :
forall E E' V,
|{e}- E ~~> E' -> vars E V -> exists V', vars E' V'.
Proof completed.
< Projection_Constraint proj_e_vars :
forall E E' V V' X,
|{e}- E ~~> E' -> vars E V -> vars E' V' -> mem X V -> mem X V'.
Proof completed.
< Theorem append__is_list__is_string :
forall L1 L2 L,
is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L.
============================
forall L1 L2 L,
is_list is_string L1 -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
< induction on 1.
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
============================
forall L1 L2 L,
is_list is_string L1 @ -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
< intros IsL1 IsL2 App.
Variables: L1 L2 L
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
IsL1 : is_list is_string L1 @
IsL2 : is_list is_string L2
App : L1 ++ L2 = L
============================
is_list is_string L
< IsL1': case IsL1.
Subgoal 1:
Variables: L2 L
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
IsL2 : is_list is_string L2
App : [] ++ L2 = L
============================
is_list is_string L
< case App.
Subgoal 1:
Variables: L
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
IsL2 : is_list is_string L
============================
is_list is_string L
< search.
Subgoal 2:
Variables: L2 L T H
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
IsL2 : is_list is_string L2
App : H::T ++ L2 = L
IsL1' : is_string H
IsL1'1 : is_list is_string T *
============================
is_list is_string L
< App: case App.
Subgoal 2:
Variables: L2 T H L4
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
IsL2 : is_list is_string L2
IsL1' : is_string H
IsL1'1 : is_list is_string T *
App : T ++ L2 = L4
============================
is_list is_string (H::L4)
< apply IH to IsL1'1 _ _.
Subgoal 2:
Variables: L2 T H L4
IH : forall L1 L2 L,
is_list is_string L1 * -> is_list is_string L2 -> L1 ++ L2 = L -> is_list is_string L
IsL2 : is_list is_string L2
IsL1' : is_string H
IsL1'1 : is_list is_string T *
App : T ++ L2 = L4
H1 : is_list is_string L4
============================
is_list is_string (H::L4)
< search.
Proof completed.
< Extensible_Theorem
vars_is : forall E V,
IsE : is_e E ->
Vars : vars E V ->
is_list is_string V
on Vars.
Subgoal 1:
Variables: N
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (var N)
Vars : vars (var N) [N] @
============================
is_list is_string [N]
< case IsE.
Subgoal 1:
Variables: N
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (var N) [N] @
H1 : is_string N
============================
is_list is_string [N]
< search.
Subgoal 2:
Variables: I
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (intlit I)
Vars : vars (intlit I) [] @
============================
is_list is_string []
< search.
Subgoal 3:
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e trueE
Vars : vars trueE [] @
============================
is_list is_string []
< search.
Subgoal 4:
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e falseE
Vars : vars falseE [] @
============================
is_list is_string []
< search.
Subgoal 5:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (add E1 E2)
Vars : vars (add E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
============================
is_list is_string V
< Is: case IsE.
Subgoal 5:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (add 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
< IsA: apply IH to _ Vars1.
Subgoal 5:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (add E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
============================
is_list is_string V
< IsB: apply IH to _ Vars2.
Subgoal 5:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (add E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
IsB : is_list is_string Vr2
============================
is_list is_string V
< apply append__is_list__is_string to _ _ Vars3.
Subgoal 5:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (add E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
IsB : is_list is_string Vr2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 6:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (eq E1 E2)
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
============================
is_list is_string V
< Is: case IsE.
Subgoal 6:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (eq 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
< IsA: apply IH to _ Vars1.
Subgoal 6:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
============================
is_list is_string V
< IsB: apply IH to _ Vars2.
Subgoal 6:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
IsB : is_list is_string Vr2
============================
is_list is_string V
< apply append__is_list__is_string to _ _ Vars3.
Subgoal 6:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
IsB : is_list is_string Vr2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 7:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (gt E1 E2)
Vars : vars (gt E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
============================
is_list is_string V
< Is: case IsE.
Subgoal 7:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (gt 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
< IsA: apply IH to _ Vars1.
Subgoal 7:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (gt E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
============================
is_list is_string V
< IsB: apply IH to _ Vars2.
Subgoal 7:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (gt E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
IsB : is_list is_string Vr2
============================
is_list is_string V
< apply append__is_list__is_string to _ _ Vars3.
Subgoal 7:
Variables: V Vr1 Vr2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (gt E1 E2) V @
Vars1 : vars E1 Vr1 *
Vars2 : vars E2 Vr2 *
Vars3 : Vr1 ++ Vr2 = V
Is : is_e E1
Is1 : is_e E2
IsA : is_list is_string Vr1
IsB : is_list is_string Vr2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 8:
Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IsE : is_e (not E1)
Vars : vars (not E1) V @
Vars1 : vars E1 V *
============================
is_list is_string V
< case IsE.
Subgoal 8:
Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (not E1) V @
Vars1 : vars E1 V *
H1 : is_e E1
============================
is_list is_string V
< apply IH to _ Vars1.
Subgoal 8:
Variables: V E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
Vars : vars (not E1) V @
Vars1 : vars E1 V *
H1 : is_e E1
H2 : is_list is_string V
============================
is_list is_string V
< search.
Proof completed.
< Theorem append__is_list__is_string__total :
forall L1 L2,
is_list is_string L1 -> is_list is_string L2 -> exists L, L1 ++ L2 = L.
============================
forall L1 L2,
is_list is_string L1 -> is_list is_string L2 -> exists L, L1 ++ L2 = L
< induction on 1.
IH : forall L1 L2,
is_list is_string L1 * -> is_list is_string L2 -> exists L, L1 ++ L2 = L
============================
forall L1 L2,
is_list is_string L1 @ -> is_list is_string L2 -> exists L, L1 ++ L2 = L
< intros IsL1 IsL2.
Variables: L1 L2
IH : forall L1 L2,
is_list is_string L1 * -> is_list is_string L2 -> exists L, L1 ++ L2 = L
IsL1 : is_list is_string L1 @
IsL2 : is_list is_string L2
============================
exists L, L1 ++ L2 = L
< IsL1': case IsL1.
Subgoal 1:
Variables: L2
IH : forall L1 L2,
is_list is_string L1 * -> is_list is_string L2 -> exists L, L1 ++ L2 = L
IsL2 : is_list is_string L2
============================
exists L, [] ++ L2 = L
< search.
Subgoal 2:
Variables: L2 T H
IH : forall L1 L2,
is_list is_string L1 * -> is_list is_string L2 -> exists L, L1 ++ L2 = L
IsL2 : is_list is_string L2
IsL1' : is_string H
IsL1'1 : is_list is_string T *
============================
exists L, H::T ++ L2 = L
< apply IH to IsL1'1 _.
Subgoal 2:
Variables: L2 T H L
IH : forall L1 L2,
is_list is_string L1 * -> is_list is_string L2 -> exists L, L1 ++ L2 = L
IsL2 : is_list is_string L2
IsL1' : is_string H
IsL1'1 : is_list is_string T *
H1 : T ++ L2 = L
============================
exists L, H::T ++ L2 = L
< search.
Proof completed.
< Extensible_Theorem
vars_exist : forall E,
IsE : is_e E ->
exists V,
vars E V
on IsE.
Subgoal 1:
Variables: S
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (var S) @
IsE1 : is_string S
============================
exists V, vars (var S) V
< search.
Subgoal 2:
Variables: I
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (intlit I) @
IsE1 : is_integer I
============================
exists V, vars (intlit I) V
< search.
Subgoal 3:
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e trueE @
============================
exists V, vars trueE V
< search.
Subgoal 4:
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e falseE @
============================
exists V, vars falseE V
< search.
Subgoal 5:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (add E1 E2) V
< V1: apply IH to IsE1.
Subgoal 5:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
============================
exists V, vars (add E1 E2) V
< V2: apply IH to IsE2.
Subgoal 5:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (add E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
============================
exists V, vars (add E1 E2) V
< Is1: apply vars_is to _ V1.
Subgoal 5:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (add 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 (add E1 E2) V
< Is2: apply vars_is to _ V2.
Subgoal 5:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (add 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 (add E1 E2) V
< apply append__is_list__is_string__total to Is1 Is2.
Subgoal 5:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (add 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 (add E1 E2) V
< search.
Subgoal 6:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (eq E1 E2) V
< V1: apply IH to IsE1.
Subgoal 6:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
============================
exists V, vars (eq E1 E2) V
< V2: apply IH to IsE2.
Subgoal 6:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
============================
exists V, vars (eq E1 E2) V
< Is1: apply vars_is to _ V1.
Subgoal 6:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (eq 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 (eq E1 E2) V
< Is2: apply vars_is to _ V2.
Subgoal 6:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (eq 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 (eq E1 E2) V
< apply append__is_list__is_string__total to Is1 Is2.
Subgoal 6:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (eq 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 (eq E1 E2) V
< search.
Subgoal 7:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (gt E1 E2) V
< V1: apply IH to IsE1.
Subgoal 7:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
============================
exists V, vars (gt E1 E2) V
< V2: apply IH to IsE2.
Subgoal 7:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (gt E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
V1 : vars E1 V
V2 : vars E2 V1
============================
exists V, vars (gt E1 E2) V
< Is1: apply vars_is to _ V1.
Subgoal 7:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (gt 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 (gt E1 E2) V
< Is2: apply vars_is to _ V2.
Subgoal 7:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (gt 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 (gt E1 E2) V
< apply append__is_list__is_string__total to Is1 Is2.
Subgoal 7:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (gt 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 (gt E1 E2) V
< search.
Subgoal 8:
Variables: E1
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (not E1) @
IsE1 : is_e E1 *
============================
exists V, vars (not E1) V
< apply IH to IsE1.
Subgoal 8:
Variables: E1 V
IH : forall E, is_e E * -> exists V, vars E V
IsE : is_e (not E1) @
IsE1 : is_e E1 *
H1 : vars E1 V
============================
exists V, vars (not E1) V
< search.
Proof completed.
< Extensible_Theorem
value_empty_typable : forall V G Ty,
Value : value V ->
Ty : ty_e G V Ty ->
ty_e [] V Ty
on Value.
Subgoal 1:
Variables: G Ty I
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value (intlit I) @
Ty : ty_e G (intlit I) Ty
============================
ty_e [] (intlit I) Ty
< case Ty.
Subgoal 1:
Variables: G I
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value (intlit I) @
============================
ty_e [] (intlit I) intTy
< search.
Subgoal 2:
Variables: G Ty
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value trueE @
Ty : ty_e G trueE Ty
============================
ty_e [] trueE Ty
< case Ty.
Subgoal 2:
Variables: G
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value trueE @
============================
ty_e [] trueE bool
< search.
Subgoal 3:
Variables: G Ty
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value falseE @
Ty : ty_e G falseE Ty
============================
ty_e [] falseE Ty
< case Ty.
Subgoal 3:
Variables: G
IH : forall V G Ty, value V * -> ty_e G V Ty -> ty_e [] V Ty
Value : value falseE @
============================
ty_e [] falseE bool
< search.
Proof completed.
< Theorem lookup_is :
forall G X V, is_list (is_pair is_string is_e) G -> lookup G X V -> is_e V.
============================
forall G X V, is_list (is_pair is_string is_e) G -> lookup G X V -> is_e V
< induction on 2.
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
============================
forall G X V, is_list (is_pair is_string is_e) G -> lookup G X V @ -> is_e V
< intros Is L.
Variables: G X V
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
Is : is_list (is_pair is_string is_e) G
L : lookup G X V @
============================
is_e V
< L: case L.
Subgoal 1:
Variables: X V Rest
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
Is : is_list (is_pair is_string is_e) ((X, V)::Rest)
============================
is_e V
< Is: case Is.
Subgoal 1:
Variables: X V Rest
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
Is : is_pair is_string is_e (X, V)
Is1 : is_list (is_pair is_string is_e) Rest
============================
is_e V
< case Is.
Subgoal 1:
Variables: X V Rest
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
Is1 : is_list (is_pair is_string is_e) Rest
H1 : is_string X
H2 : is_e V
============================
is_e V
< search.
Subgoal 2:
Variables: X V Rest V1 K
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
Is : is_list (is_pair is_string is_e) ((K, V1)::Rest)
L : K = X -> false
L1 : lookup Rest X V *
============================
is_e V
< case Is.
Subgoal 2:
Variables: X V Rest V1 K
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
L : K = X -> false
L1 : lookup Rest X V *
H1 : is_pair is_string is_e (K, V1)
H2 : is_list (is_pair is_string is_e) Rest
============================
is_e V
< apply IH to _ L1.
Subgoal 2:
Variables: X V Rest V1 K
IH : forall G X V,
is_list (is_pair is_string is_e) G -> lookup G X V * -> is_e V
L : K = X -> false
L1 : lookup Rest X V *
H1 : is_pair is_string is_e (K, V1)
H2 : is_list (is_pair is_string is_e) Rest
H3 : is_e V
============================
is_e V
< search.
Proof completed.
< Extensible_Theorem
eval_e_is : forall G E V,
IsE : is_e E ->
IsCtx : is_list (is_pair is_string is_e) G ->
Ev : eval_e G E V ->
is_e V
on Ev.
Subgoal 1:
Variables: G V N
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 (var N)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (var N) V @
Ev1 : lookup G N V
============================
is_e V
< apply lookup_is to _ Ev1.
Subgoal 1:
Variables: G V N
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 (var N)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (var N) V @
Ev1 : lookup G N V
H1 : is_e V
============================
is_e V
< search.
Subgoal 2:
Variables: G I
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 (intlit I)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (intlit I) (intlit I) @
============================
is_e (intlit I)
< search.
Subgoal 3:
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 trueE
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G trueE trueE @
============================
is_e trueE
< search.
Subgoal 4:
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 falseE
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G falseE falseE @
============================
is_e falseE
< search.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
============================
is_e (intlit I)
< case IsE.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : is_e E1
H2 : is_e E2
============================
is_e (intlit I)
< Is1: apply IH to _ _ Ev1.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : is_e E1
H2 : is_e E2
Is1 : is_e (intlit I1)
============================
is_e (intlit I)
< Is2: apply IH to _ _ Ev2.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : is_e E1
H2 : is_e E2
Is1 : is_e (intlit I1)
Is2 : is_e (intlit I2)
============================
is_e (intlit I)
< case Is1.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : is_e E1
H2 : is_e E2
Is2 : is_e (intlit I2)
H3 : is_integer I1
============================
is_e (intlit I)
< case Is2.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : is_e E1
H2 : is_e E2
H3 : is_integer I1
H4 : is_integer I2
============================
is_e (intlit I)
< apply plus_integer_is_integer to _ _ Ev3.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : is_e E1
H2 : is_e E2
H3 : is_integer I1
H4 : is_integer I2
H5 : is_integer I
============================
is_e (intlit I)
< search.
Subgoal 6:
Variables: G V2 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 (eq E1 E2)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (eq E1 E2) trueE @
Ev1 : eval_e G E1 V2 *
Ev2 : eval_e G E2 V2 *
============================
is_e trueE
< search.
Subgoal 7:
Variables: G V1 V2 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 (eq E1 E2)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (eq E1 E2) falseE @
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
Ev3 : V1 = V2 -> false
============================
is_e falseE
< search.
Subgoal 8:
Variables: G I1 I2 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 (gt E1 E2)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (gt E1 E2) trueE @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 > I2
============================
is_e trueE
< search.
Subgoal 9:
Variables: G I1 I2 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 (gt E1 E2)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (gt E1 E2) falseE @
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 <= I2
============================
is_e falseE
< search.
Subgoal 10:
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 (not E1)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (not E1) trueE @
Ev1 : eval_e G E1 falseE *
============================
is_e trueE
< search.
Subgoal 11:
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 (not E1)
IsCtx : is_list (is_pair is_string is_e) G
Ev : eval_e G (not E1) falseE @
Ev1 : eval_e G E1 trueE *
============================
is_e falseE
< search.
Proof completed.
< Extensible_Theorem
type_preservation_e : forall TG EG E Ty V,
Ty : ty_e TG E Ty ->
Ev : eval_e EG E V ->
Rel : (forall X Ty V,
lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty) ->
ty_e [] V Ty
on Ev.
Subgoal 1:
Variables: TG EG Ty V N
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 (var N) Ty
Ev : eval_e EG (var N) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : lookup EG N V
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 1:
Variables: TG EG Ty V N
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 (var N) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : lookup EG N V
Ty : lookup TG N Ty
============================
ty_e [] V Ty
< apply Rel to Ty Ev1.
Subgoal 1:
Variables: TG EG Ty V N
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 (var N) V @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : lookup EG N V
Ty : lookup TG N Ty
H1 : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 2:
Variables: TG EG Ty I
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 (intlit I) Ty
Ev : eval_e EG (intlit I) (intlit I) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
ty_e [] (intlit I) Ty
< case Ty.
Subgoal 2:
Variables: TG EG I
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 (intlit I) (intlit I) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
ty_e [] (intlit I) intTy
< search.
Subgoal 3:
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 trueE Ty
Ev : eval_e EG trueE trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
ty_e [] trueE Ty
< case Ty.
Subgoal 3:
Variables: TG EG
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 trueE trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
ty_e [] trueE bool
< search.
Subgoal 4:
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 falseE Ty
Ev : eval_e EG falseE falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
ty_e [] falseE Ty
< case Ty.
Subgoal 4:
Variables: TG EG
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 falseE falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
============================
ty_e [] falseE bool
< search.
Subgoal 5:
Variables: TG EG Ty I1 I2 I 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 (add E1 E2) Ty
Ev : eval_e EG (add E1 E2) (intlit I) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (intlit I1) *
Ev2 : eval_e EG E2 (intlit I2) *
Ev3 : I1 + I2 = I
============================
ty_e [] (intlit I) Ty
< case Ty.
Subgoal 5:
Variables: TG EG I1 I2 I 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
Ev : eval_e EG (add E1 E2) (intlit I) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (intlit I1) *
Ev2 : eval_e EG E2 (intlit I2) *
Ev3 : I1 + I2 = I
H1 : ty_e TG E1 intTy
H2 : ty_e TG E2 intTy
============================
ty_e [] (intlit I) intTy
< search.
Subgoal 6:
Variables: TG EG Ty V2 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 (eq E1 E2) Ty
Ev : eval_e EG (eq E1 E2) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 V2 *
Ev2 : eval_e EG E2 V2 *
============================
ty_e [] trueE Ty
< case Ty.
Subgoal 6:
Variables: TG EG V2 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
Ev : eval_e EG (eq E1 E2) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 V2 *
Ev2 : eval_e EG E2 V2 *
H1 : ty_e TG E1 intTy
H2 : ty_e TG E2 intTy
============================
ty_e [] trueE bool
< search.
Subgoal 7:
Variables: TG EG Ty V1 V2 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 (eq E1 E2) Ty
Ev : eval_e EG (eq E1 E2) falseE @
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 *
Ev3 : V1 = V2 -> false
============================
ty_e [] falseE Ty
< case Ty.
Subgoal 7:
Variables: TG EG V1 V2 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
Ev : eval_e EG (eq E1 E2) falseE @
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 *
Ev3 : V1 = V2 -> false
H1 : ty_e TG E1 intTy
H2 : ty_e TG E2 intTy
============================
ty_e [] falseE bool
< search.
Subgoal 8:
Variables: TG EG Ty I1 I2 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 (gt E1 E2) Ty
Ev : eval_e EG (gt E1 E2) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (intlit I1) *
Ev2 : eval_e EG E2 (intlit I2) *
Ev3 : I1 > I2
============================
ty_e [] trueE Ty
< case Ty.
Subgoal 8:
Variables: TG EG I1 I2 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
Ev : eval_e EG (gt E1 E2) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (intlit I1) *
Ev2 : eval_e EG E2 (intlit I2) *
Ev3 : I1 > I2
H1 : ty_e TG E1 intTy
H2 : ty_e TG E2 intTy
============================
ty_e [] trueE bool
< search.
Subgoal 9:
Variables: TG EG Ty I1 I2 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 (gt E1 E2) Ty
Ev : eval_e EG (gt E1 E2) falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (intlit I1) *
Ev2 : eval_e EG E2 (intlit I2) *
Ev3 : I1 <= I2
============================
ty_e [] falseE Ty
< case Ty.
Subgoal 9:
Variables: TG EG I1 I2 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
Ev : eval_e EG (gt E1 E2) falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 (intlit I1) *
Ev2 : eval_e EG E2 (intlit I2) *
Ev3 : I1 <= I2
H1 : ty_e TG E1 intTy
H2 : ty_e TG E2 intTy
============================
ty_e [] falseE bool
< search.
Subgoal 10:
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 (not E1) Ty
Ev : eval_e EG (not E1) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 falseE *
============================
ty_e [] trueE Ty
< case Ty.
Subgoal 10:
Variables: TG EG 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 (not E1) trueE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 falseE *
H1 : ty_e TG E1 bool
============================
ty_e [] trueE bool
< search.
Subgoal 11:
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 (not E1) Ty
Ev : eval_e EG (not E1) falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 trueE *
============================
ty_e [] falseE Ty
< case Ty.
Subgoal 11:
Variables: TG EG 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 (not E1) falseE @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E1 trueE *
H1 : ty_e TG E1 bool
============================
ty_e [] falseE bool
< search.
Proof completed.
< Extensible_Theorem
var_types_maintained : forall G S G' X Ty,
Ty : ty_s G S G' ->
Lkp : lookup G X Ty ->
lookup G' X Ty
on Ty.
Subgoal 1:
Variables: G' X Ty
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G' skipS G' @
Lkp : lookup G' X Ty
============================
lookup G' X Ty
< search.
Subgoal 2:
Variables: G G' X Ty G3 S2 S1
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (seq S1 S2) G' @
Lkp : lookup G X Ty
Ty1 : ty_s G S1 G3 *
Ty2 : ty_s G3 S2 G' *
============================
lookup G' X Ty
< Lkp': apply IH to Ty1 Lkp.
Subgoal 2:
Variables: G G' X Ty G3 S2 S1
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (seq S1 S2) G' @
Lkp : lookup G X Ty
Ty1 : ty_s G S1 G3 *
Ty2 : ty_s G3 S2 G' *
Lkp' : lookup G3 X Ty
============================
lookup G' X Ty
< apply IH to Ty2 Lkp'.
Subgoal 2:
Variables: G G' X Ty G3 S2 S1
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (seq S1 S2) G' @
Lkp : lookup G X Ty
Ty1 : ty_s G S1 G3 *
Ty2 : ty_s G3 S2 G' *
Lkp' : lookup G3 X Ty
H1 : lookup G' X Ty
============================
lookup G' X Ty
< search.
Subgoal 3:
Variables: G X Ty Ty1 N E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (decl N Ty1 E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
============================
lookup ((N, Ty1)::G) X Ty
< NEq: assert N = X -> false.
Subgoal 3.1:
Variables: G X Ty Ty1 N E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (decl N Ty1 E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
============================
N = X -> false
< intros E.
Subgoal 3.1:
Variables: G X Ty Ty1 N E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (decl N Ty1 E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
E : N = X
============================
false
< case E.
Subgoal 3.1:
Variables: G X Ty Ty1 E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (decl X Ty1 E) ((X, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G X
============================
false
< apply no_lookup to Ty2 Lkp.
Subgoal 3:
Variables: G X Ty Ty1 N E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G (decl N Ty1 E) ((N, Ty1)::G) @
Lkp : lookup G X Ty
Ty1 : ty_e G E Ty1
Ty2 : no_lookup G N
NEq : N = X -> false
============================
lookup ((N, Ty1)::G) X Ty
< search.
Subgoal 4:
Variables: G' X Ty Ty1 E N
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G' (assign N E) G' @
Lkp : lookup G' X Ty
Ty1 : ty_e G' E Ty1
Ty2 : lookup G' N Ty1
============================
lookup G' X Ty
< search.
Subgoal 5:
Variables: G' X Ty G2 G3 S2 S1 E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G' (ifte E S1 S2) G' @
Lkp : lookup G' X Ty
Ty1 : ty_e G' E bool
Ty2 : ty_s G' S1 G2 *
Ty3 : ty_s G' S2 G3 *
============================
lookup G' X Ty
< search.
Subgoal 6:
Variables: G' X Ty G2 S1 E
IH : forall G S G' X Ty, ty_s G S G' * -> lookup G X Ty -> lookup G' X Ty
Ty : ty_s G' (while E S1) G' @
Lkp : lookup G' X Ty
Ty1 : ty_e G' E bool
Ty2 : ty_s G' S1 G2 *
============================
lookup G' X Ty
< search.
Proof completed.
< Extensible_Theorem
type_preservation_s : forall TG EG S TG' EG' X Ty V,
Ty : ty_s TG S TG' ->
Ev : eval_s EG S EG' ->
Rel : (forall X Ty V,
lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty) ->
LkpTy : lookup TG' X Ty ->
LkpV : lookup EG' X V ->
ty_e [] V Ty
on Ev.
Subgoal 1:
Variables: TG TG' EG' X Ty V
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 skipS TG'
Ev : eval_s EG' skipS EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG' X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
============================
ty_e [] V Ty
< case Ty.
Subgoal 1:
Variables: TG' EG' X Ty V
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' skipS EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
============================
ty_e [] V Ty
< backchain Rel.
Subgoal 2:
Variables: TG EG TG' X Ty V V1 N 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
Ty : ty_s TG (decl N Ty1 E) TG'
Ev : eval_s EG (decl N Ty1 E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 2:
Variables: TG EG X Ty V V1 N 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 (decl N Ty1 E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup ((N, Ty1)::TG) X Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
============================
ty_e [] V Ty
< TE: apply type_preservation_e to Ty Ev1 Rel.
Subgoal 2:
Variables: TG EG X Ty V V1 N 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 (decl N Ty1 E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup ((N, Ty1)::TG) X Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
TE : ty_e [] V1 Ty1
============================
ty_e [] V Ty
< LT: case LkpTy.
Subgoal 2.1:
Variables: TG EG X Ty V V1 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
Ev : eval_s EG (decl X Ty E) ((X, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpV : lookup ((X, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty
Ty1 : no_lookup TG X
TE : ty_e [] V1 Ty
============================
ty_e [] V Ty
< LV: case LkpV.
Subgoal 2.1.1:
Variables: TG EG X Ty V 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
Ev : eval_s EG (decl X Ty E) ((X, V)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V
Ty : ty_e TG E Ty
Ty1 : no_lookup TG X
TE : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 2.1.2:
Variables: TG EG X Ty V V1 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
Ev : eval_s EG (decl X Ty E) ((X, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty
Ty1 : no_lookup TG X
TE : ty_e [] V1 Ty
LV : X = X -> false
LV1 : lookup EG X V
============================
ty_e [] V Ty
< apply LV to _.
Subgoal 2.2:
Variables: TG EG X Ty V V1 N 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 (decl N Ty1 E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpV : lookup ((N, V1)::EG) X V
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
TE : ty_e [] V1 Ty1
LT : N = X -> false
LT1 : lookup TG X Ty
============================
ty_e [] V Ty
< LV: case LkpV.
Subgoal 2.2.1:
Variables: TG EG X Ty V 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 (decl X Ty1 E) ((X, V)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG X
TE : ty_e [] V Ty1
LT : X = X -> false
LT1 : lookup TG X Ty
============================
ty_e [] V Ty
< apply LT to _.
Subgoal 2.2.2:
Variables: TG EG X Ty V V1 N 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 (decl N Ty1 E) ((N, V1)::EG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
Ev1 : eval_e EG E V1
Ty : ty_e TG E Ty1
Ty1 : no_lookup TG N
TE : ty_e [] V1 Ty1
LT : N = X -> false
LT1 : lookup TG X Ty
LV : N = X -> false
LV1 : lookup EG X V
============================
ty_e [] V Ty
< backchain Rel.
Subgoal 3:
Variables: TG EG TG' X Ty V VOld NewG V1 N 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 (assign N E) TG'
Ev : eval_s EG (assign N E) ((N, V1)::NewG) @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((N, V1)::NewG) X V
Ev1 : eval_e EG E V1
Ev2 : select (N, VOld) NewG EG
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 3:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((N, V1)::NewG) X V
Ev1 : eval_e EG E V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
============================
ty_e [] V Ty
< TE: apply type_preservation_e to Ty Ev1 Rel.
Subgoal 3:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup ((N, V1)::NewG) X V
Ev1 : eval_e EG E V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
============================
ty_e [] V Ty
< LV: case LkpV.
Subgoal 3.1:
Variables: EG TG' X Ty V VOld NewG 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 (assign X E) ((X, V)::NewG) @
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 V
Ev2 : select (X, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' X Ty1
TE : ty_e [] V Ty1
============================
ty_e [] V Ty
< apply lookup_unique to Ty1 LkpTy.
Subgoal 3.1:
Variables: EG TG' X Ty V VOld NewG 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
Ev : eval_s EG (assign X E) ((X, V)::NewG) @
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 V
Ev2 : select (X, VOld) NewG EG
Ty : ty_e TG' E Ty
Ty1 : lookup TG' X Ty
TE : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 3.2:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
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 V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = X -> false
LV1 : lookup NewG X V
============================
ty_e [] V Ty
< assert X = N -> false.
Subgoal 3.2.1:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
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 V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = X -> false
LV1 : lookup NewG X V
============================
X = N -> false
< intros E.
Subgoal 3.2.1:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
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 V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = X -> false
LV1 : lookup NewG X V
E : X = N
============================
false
< case E.
Subgoal 3.2.1:
Variables: EG TG' Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' N Ty
Ev1 : eval_e EG E V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = N -> false
LV1 : lookup NewG N V
============================
false
< backchain LV.
Subgoal 3.2:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
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 V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = X -> false
LV1 : lookup NewG X V
H1 : X = N -> false
============================
ty_e [] V Ty
< apply lookup_after_select_before to LV1 Ev2 _.
Subgoal 3.2:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
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 V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = X -> false
LV1 : lookup NewG X V
H1 : X = N -> false
H2 : lookup EG X V
============================
ty_e [] V Ty
< apply Rel to LkpTy _.
Subgoal 3.2:
Variables: EG TG' X Ty V VOld NewG V1 N 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 (assign N E) ((N, V1)::NewG) @
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 V1
Ev2 : select (N, VOld) NewG EG
Ty : ty_e TG' E Ty1
Ty1 : lookup TG' N Ty1
TE : ty_e [] V1 Ty1
LV : N = X -> false
LV1 : lookup NewG X V
H1 : X = N -> false
H2 : lookup EG X V
H3 : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 4:
Variables: TG EG TG' EG' X Ty V G1 S2 S1
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 (seq S1 S2) TG'
Ev : eval_s EG (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 4:
Variables: TG EG TG' EG' X Ty V G1 S2 S1 G2
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 (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
Ty : ty_s TG S1 G2
Ty1 : ty_s G2 S2 TG'
============================
ty_e [] V Ty
< Rel': assert forall X1 Ty1 V1,
lookup G2 X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1.
Subgoal 4.1:
Variables: TG EG TG' EG' X Ty V G1 S2 S1 G2
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 (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
Ty : ty_s TG S1 G2
Ty1 : ty_s G2 S2 TG'
============================
forall X1 Ty1 V1, lookup G2 X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1
< intros LT LV.
Subgoal 4.1:
Variables: TG EG TG' EG' X Ty V G1 S2 S1 G2 X1 Ty1 V1
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 (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
Ty : ty_s TG S1 G2
Ty1 : ty_s G2 S2 TG'
LT : lookup G2 X1 Ty1
LV : lookup G1 X1 V1
============================
ty_e [] V1 Ty1
< apply IH to Ty Ev1 Rel LT LV.
Subgoal 4.1:
Variables: TG EG TG' EG' X Ty V G1 S2 S1 G2 X1 Ty1 V1
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 (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
Ty : ty_s TG S1 G2
Ty1 : ty_s G2 S2 TG'
LT : lookup G2 X1 Ty1
LV : lookup G1 X1 V1
H1 : ty_e [] V1 Ty1
============================
ty_e [] V1 Ty1
< search.
Subgoal 4:
Variables: TG EG TG' EG' X Ty V G1 S2 S1 G2
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 (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
Ty : ty_s TG S1 G2
Ty1 : ty_s G2 S2 TG'
Rel' : forall X1 Ty1 V1, lookup G2 X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1
============================
ty_e [] V Ty
< apply IH to Ty1 Ev2 Rel' LkpTy LkpV.
Subgoal 4:
Variables: TG EG TG' EG' X Ty V G1 S2 S1 G2
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 (seq S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_s EG S1 G1 *
Ev2 : eval_s G1 S2 EG' *
Ty : ty_s TG S1 G2
Ty1 : ty_s G2 S2 TG'
Rel' : forall X1 Ty1 V1, lookup G2 X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1
H1 : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 5:
Variables: TG EG TG' EG' X Ty V S2 S1 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 (ifte E S1 S2) TG'
Ev : eval_s EG (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 EG' *
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 5:
Variables: EG TG' EG' X Ty V S2 S1 E G1 G2
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 (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 EG' *
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
Ty2 : ty_s TG' S2 G2
============================
ty_e [] V Ty
< L: apply var_types_maintained to Ty1 LkpTy.
Subgoal 5:
Variables: EG TG' EG' X Ty V S2 S1 E G1 G2
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 (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 EG' *
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
Ty2 : ty_s TG' S2 G2
L : lookup G1 X Ty
============================
ty_e [] V Ty
< apply IH to Ty1 Ev2 Rel L LkpV.
Subgoal 5:
Variables: EG TG' EG' X Ty V S2 S1 E G1 G2
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 (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 EG' *
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
Ty2 : ty_s TG' S2 G2
L : lookup G1 X Ty
H1 : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 6:
Variables: TG EG TG' EG' X Ty V S2 S1 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 (ifte E S1 S2) TG'
Ev : eval_s EG (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E falseE
Ev2 : eval_s EG S2 EG' *
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 6:
Variables: EG TG' EG' X Ty V S2 S1 E G1 G2
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 (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E falseE
Ev2 : eval_s EG S2 EG' *
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
Ty2 : ty_s TG' S2 G2
============================
ty_e [] V Ty
< L: apply var_types_maintained to Ty2 LkpTy.
Subgoal 6:
Variables: EG TG' EG' X Ty V S2 S1 E G1 G2
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 (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E falseE
Ev2 : eval_s EG S2 EG' *
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
Ty2 : ty_s TG' S2 G2
L : lookup G2 X Ty
============================
ty_e [] V Ty
< apply IH to Ty2 Ev2 Rel L LkpV.
Subgoal 6:
Variables: EG TG' EG' X Ty V S2 S1 E G1 G2
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 (ifte E S1 S2) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E falseE
Ev2 : eval_s EG S2 EG' *
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
Ty2 : ty_s TG' S2 G2
L : lookup G2 X Ty
H1 : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 7:
Variables: TG EG TG' EG' X Ty V G1 S1 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 (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
============================
ty_e [] V Ty
< Ty: case Ty (keep).
Subgoal 7:
Variables: EG TG' EG' X Ty V G1 S1 E G2
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
============================
ty_e [] V Ty
< Rel': assert forall X1 Ty1 V1,
lookup TG' X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1.
Subgoal 7.1:
Variables: EG TG' EG' X Ty V G1 S1 E G2
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
============================
forall X1 Ty1 V1, lookup TG' X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1
< intros LT LV.
Subgoal 7.1:
Variables: EG TG' EG' X Ty V G1 S1 E G2 X1 Ty1 V1
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
LT : lookup TG' X1 Ty1
LV : lookup G1 X1 V1
============================
ty_e [] V1 Ty1
< L: apply var_types_maintained to Ty2 LT.
Subgoal 7.1:
Variables: EG TG' EG' X Ty V G1 S1 E G2 X1 Ty1 V1
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
LT : lookup TG' X1 Ty1
LV : lookup G1 X1 V1
L : lookup G2 X1 Ty1
============================
ty_e [] V1 Ty1
< apply IH to Ty2 Ev2 Rel L LV.
Subgoal 7.1:
Variables: EG TG' EG' X Ty V G1 S1 E G2 X1 Ty1 V1
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
LT : lookup TG' X1 Ty1
LV : lookup G1 X1 V1
L : lookup G2 X1 Ty1
H1 : ty_e [] V1 Ty1
============================
ty_e [] V1 Ty1
< search.
Subgoal 7:
Variables: EG TG' EG' X Ty V G1 S1 E G2
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
Rel' : forall X1 Ty1 V1, lookup TG' X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1
============================
ty_e [] V Ty
< apply IH to Ty Ev3 Rel' LkpTy LkpV.
Subgoal 7:
Variables: EG TG' EG' X Ty V G1 S1 E G2
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' (while E S1) TG'
Ev : eval_s EG (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG E trueE
Ev2 : eval_s EG S1 G1 *
Ev3 : eval_s G1 (while E S1) EG' *
Ty1 : ty_e TG' E bool
Ty2 : ty_s TG' S1 G2
Rel' : forall X1 Ty1 V1, lookup TG' X1 Ty1 -> lookup G1 X1 V1 -> ty_e [] V1 Ty1
H1 : ty_e [] V Ty
============================
ty_e [] V Ty
< search.
Subgoal 8:
Variables: TG TG' EG' X Ty V S1 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 (while E S1) TG'
Ev : eval_s EG' (while E S1) EG' @
Rel : forall X Ty V, lookup TG X Ty -> lookup EG' X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG' E falseE
============================
ty_e [] V Ty
< Ty: case Ty.
Subgoal 8:
Variables: TG' EG' X Ty V S1 E G1
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' (while E S1) EG' @
Rel : forall X Ty V, lookup TG' X Ty -> lookup EG' X V -> ty_e [] V Ty
LkpTy : lookup TG' X Ty
LkpV : lookup EG' X V
Ev1 : eval_e EG' E falseE
Ty : ty_e TG' E bool
Ty1 : ty_s TG' S1 G1
============================
ty_e [] V Ty
< backchain Rel.
Proof completed.
< Projection_Constraint proj_eval_e :
forall G E E' V,
|{e}- E ~~> E' -> eval_e G E V -> is_list (is_pair is_string is_e) G -> is_e E ->
exists V', eval_e G E' V'.
Proof completed.
< Extensible_Theorem
eval_e_unique : forall G E V1 V2,
Ev1 : eval_e G E V1 ->
Ev2 : eval_e G E V2 ->
V1 = V2
on Ev1.
Subgoal 1:
Variables: G V1 V2 N
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (var N) V1 @
Ev2 : eval_e G (var N) V2
Ev3 : lookup G N V1
============================
V1 = V2
< Ev2: case Ev2.
Subgoal 1:
Variables: G V1 V2 N
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (var N) V1 @
Ev3 : lookup G N V1
Ev2 : lookup G N V2
============================
V1 = V2
< apply lookup_unique to Ev3 Ev2.
Subgoal 1:
Variables: G V2 N
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (var N) V2 @
Ev3 : lookup G N V2
Ev2 : lookup G N V2
============================
V2 = V2
< search.
Subgoal 2:
Variables: G V2 I
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (intlit I) (intlit I) @
Ev2 : eval_e G (intlit I) V2
============================
intlit I = V2
< case Ev2.
Subgoal 2:
Variables: G I
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (intlit I) (intlit I) @
============================
intlit I = intlit I
< search.
Subgoal 3:
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 trueE trueE @
Ev2 : eval_e G trueE V2
============================
trueE = V2
< case Ev2.
Subgoal 3:
Variables: G
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G trueE trueE @
============================
trueE = trueE
< search.
Subgoal 4:
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 falseE falseE @
Ev2 : eval_e G falseE V2
============================
falseE = V2
< case Ev2.
Subgoal 4:
Variables: G
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G falseE falseE @
============================
falseE = falseE
< search.
Subgoal 5:
Variables: G V2 I1 I2 I E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (add E1 E2) (intlit I) @
Ev2 : eval_e G (add E1 E2) V2
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 + I2 = I
============================
intlit I = V2
< Ev2: case Ev2.
Subgoal 5:
Variables: G I1 I2 I E2 E1 I4 I5 I3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (add E1 E2) (intlit I) @
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G E1 (intlit I4)
Ev6 : eval_e G E2 (intlit I5)
Ev7 : I4 + I5 = I3
============================
intlit I = intlit I3
< apply IH to Ev3 Ev2.
Subgoal 5:
Variables: G I2 I E2 E1 I4 I5 I3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (add E1 E2) (intlit I) @
Ev3 : eval_e G E1 (intlit I4) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I4 + I2 = I
Ev2 : eval_e G E1 (intlit I4)
Ev6 : eval_e G E2 (intlit I5)
Ev7 : I4 + I5 = I3
============================
intlit I = intlit I3
< apply IH to Ev4 Ev6.
Subgoal 5:
Variables: G I E2 E1 I4 I5 I3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (add E1 E2) (intlit I) @
Ev3 : eval_e G E1 (intlit I4) *
Ev4 : eval_e G E2 (intlit I5) *
Ev5 : I4 + I5 = I
Ev2 : eval_e G E1 (intlit I4)
Ev6 : eval_e G E2 (intlit I5)
Ev7 : I4 + I5 = I3
============================
intlit I = intlit I3
< apply plus_integer_unique to Ev5 Ev7.
Subgoal 5:
Variables: G E2 E1 I4 I5 I3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (add E1 E2) (intlit I3) @
Ev3 : eval_e G E1 (intlit I4) *
Ev4 : eval_e G E2 (intlit I5) *
Ev5 : I4 + I5 = I3
Ev2 : eval_e G E1 (intlit I4)
Ev6 : eval_e G E2 (intlit I5)
Ev7 : I4 + I5 = I3
============================
intlit I3 = intlit I3
< search.
Subgoal 6:
Variables: G V2 V4 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueE @
Ev2 : eval_e G (eq E1 E2) V2
Ev3 : eval_e G E1 V4 *
Ev4 : eval_e G E2 V4 *
============================
trueE = V2
< Ev2: case Ev2.
Subgoal 6.1:
Variables: G V4 E2 E1 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueE @
Ev3 : eval_e G E1 V4 *
Ev4 : eval_e G E2 V4 *
Ev2 : eval_e G E1 V6
Ev5 : eval_e G E2 V6
============================
trueE = trueE
< search.
Subgoal 6.2:
Variables: G V4 E2 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 (eq E1 E2) trueE @
Ev3 : eval_e G E1 V4 *
Ev4 : eval_e G E2 V4 *
Ev2 : eval_e G E1 V5
Ev5 : eval_e G E2 V6
Ev6 : V5 = V6 -> false
============================
trueE = falseE
< apply IH to Ev3 Ev2.
Subgoal 6.2:
Variables: G E2 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 (eq E1 E2) trueE @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V5 *
Ev2 : eval_e G E1 V5
Ev5 : eval_e G E2 V6
Ev6 : V5 = V6 -> false
============================
trueE = falseE
< apply IH to Ev4 Ev5.
Subgoal 6.2:
Variables: G E2 E1 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueE @
Ev3 : eval_e G E1 V6 *
Ev4 : eval_e G E2 V6 *
Ev2 : eval_e G E1 V6
Ev5 : eval_e G E2 V6
Ev6 : V6 = V6 -> false
============================
trueE = falseE
< apply Ev6 to _.
Subgoal 7:
Variables: G V2 V3 V4 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseE @
Ev2 : eval_e G (eq E1 E2) V2
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : V3 = V4 -> false
============================
falseE = V2
< Ev2: case Ev2.
Subgoal 7.1:
Variables: G V3 V4 E2 E1 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseE @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : V3 = V4 -> false
Ev2 : eval_e G E1 V6
Ev6 : eval_e G E2 V6
============================
falseE = trueE
< apply IH to Ev3 Ev2.
Subgoal 7.1:
Variables: G V4 E2 E1 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseE @
Ev3 : eval_e G E1 V6 *
Ev4 : eval_e G E2 V4 *
Ev5 : V6 = V4 -> false
Ev2 : eval_e G E1 V6
Ev6 : eval_e G E2 V6
============================
falseE = trueE
< apply IH to Ev4 Ev6.
Subgoal 7.1:
Variables: G E2 E1 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseE @
Ev3 : eval_e G E1 V6 *
Ev4 : eval_e G E2 V6 *
Ev5 : V6 = V6 -> false
Ev2 : eval_e G E1 V6
Ev6 : eval_e G E2 V6
============================
falseE = trueE
< apply Ev5 to _.
Subgoal 7.2:
Variables: G V3 V4 E2 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 (eq E1 E2) falseE @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : V3 = V4 -> false
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : V5 = V6 -> false
============================
falseE = falseE
< search.
Subgoal 8:
Variables: G V2 I1 I2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) trueE @
Ev2 : eval_e G (gt E1 E2) V2
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 > I2
============================
trueE = V2
< Ev2: case Ev2.
Subgoal 8.1:
Variables: G I1 I2 E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) trueE @
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 > I2
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 > I4
============================
trueE = trueE
< search.
Subgoal 8.2:
Variables: G I1 I2 E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) trueE @
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 > I2
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 <= I4
============================
trueE = falseE
< apply IH to Ev3 Ev2.
Subgoal 8.2:
Variables: G I2 E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) trueE @
Ev3 : eval_e G E1 (intlit I3) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I3 > I2
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 <= I4
============================
trueE = falseE
< apply IH to Ev4 Ev6.
Subgoal 8.2:
Variables: G E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) trueE @
Ev3 : eval_e G E1 (intlit I3) *
Ev4 : eval_e G E2 (intlit I4) *
Ev5 : I3 > I4
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 <= I4
============================
trueE = falseE
< apply greater_lesseq_integer_false to Ev5 Ev7.
Subgoal 9:
Variables: G V2 I1 I2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) falseE @
Ev2 : eval_e G (gt E1 E2) V2
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 <= I2
============================
falseE = V2
< Ev2: case Ev2.
Subgoal 9.1:
Variables: G I1 I2 E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) falseE @
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 > I4
============================
falseE = trueE
< apply IH to Ev3 Ev2.
Subgoal 9.1:
Variables: G I2 E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) falseE @
Ev3 : eval_e G E1 (intlit I3) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I3 <= I2
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 > I4
============================
falseE = trueE
< apply IH to Ev4 Ev6.
Subgoal 9.1:
Variables: G E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) falseE @
Ev3 : eval_e G E1 (intlit I3) *
Ev4 : eval_e G E2 (intlit I4) *
Ev5 : I3 <= I4
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 > I4
============================
falseE = trueE
< apply greater_lesseq_integer_false to Ev7 Ev5.
Subgoal 9.2:
Variables: G I1 I2 E2 E1 I3 I4
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
Ev1 : eval_e G (gt E1 E2) falseE @
Ev3 : eval_e G E1 (intlit I1) *
Ev4 : eval_e G E2 (intlit I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G E1 (intlit I3)
Ev6 : eval_e G E2 (intlit I4)
Ev7 : I3 <= I4
============================
falseE = falseE
< search.
Subgoal 10:
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 (not E1) trueE @
Ev2 : eval_e G (not E1) V2
Ev3 : eval_e G E1 falseE *
============================
trueE = V2
< Ev2: case Ev2.
Subgoal 10.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 (not E1) trueE @
Ev3 : eval_e G E1 falseE *
Ev2 : eval_e G E1 falseE
============================
trueE = trueE
< search.
Subgoal 10.2:
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 (not E1) trueE @
Ev3 : eval_e G E1 falseE *
Ev2 : eval_e G E1 trueE
============================
trueE = falseE
< apply IH to Ev3 Ev2.
Subgoal 11:
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 (not E1) falseE @
Ev2 : eval_e G (not E1) V2
Ev3 : eval_e G E1 trueE *
============================
falseE = V2
< Ev2: case Ev2.
Subgoal 11.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 (not E1) falseE @
Ev3 : eval_e G E1 trueE *
Ev2 : eval_e G E1 falseE
============================
falseE = trueE
< apply IH to Ev3 Ev2.
Subgoal 11.2:
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 (not E1) falseE @
Ev3 : eval_e G E1 trueE *
Ev2 : eval_e G E1 trueE
============================
falseE = falseE
< search.
Proof completed.
< Projection_Constraint proj_s_eval :
forall S S' G G2,
|{s}- S ~~> S' -> eval_s G S G2 -> exists G', eval_s G S' G'.
Proof completed.
< Ext_Size eval_s G S G1.
Proof completed.
< Proj_Rel eval_s G S G1.
Proof completed.
< Ext_Ind forall G S G1, eval_s G S G1.
Subgoal 1:
Variables: G1
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}> G1 skipS G1 0 @@
Acc : acc 0 @
============================
<eval_s {P}> G1 skipS G1
< search.
Subgoal 2:
Variables: G V N1 E Ty
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 (decl N1 Ty E) ((N1, V)::G) 0 @@
Acc : acc 0 @
R1 : eval_e G E V
============================
<eval_s {P}> G (decl N1 Ty E) ((N1, V)::G)
< search.
Subgoal 3:
Variables: G VOld NewG V N1 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 (assign N1 E) ((N1, V)::NewG) 0 @@
Acc : acc 0 @
R1 : eval_e G E V
R2 : select (N1, VOld) NewG G
============================
<eval_s {P}> G (assign N1 E) ((N1, V)::NewG)
< search.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
============================
<eval_s {P}> G (seq S1 S2) G1
< apply ext_size_is_int_eval_s to R2.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
============================
<eval_s {P}> G (seq S1 S2) G1
< apply ext_size_is_int_eval_s to R3.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
============================
<eval_s {P}> G (seq S1 S2) G1
< apply ext_size_pos_eval_s to R2.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
============================
<eval_s {P}> G (seq S1 S2) G1
< apply ext_size_pos_eval_s to R3.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
============================
<eval_s {P}> G (seq S1 S2) G1
< Or2: apply lt_left to R1 _ _.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
============================
<eval_s {P}> G (seq S1 S2) G1
< Or3: apply lt_right to R1 _ _ _.
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
Or3 : N3 < N \/ N3 = N
============================
<eval_s {P}> G (seq S1 S2) G1
< A: case Acc (keep).
Subgoal 4:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
============================
<eval_s {P}> G (seq S1 S2) G1
< Or2: case Or2.
Subgoal 4.1:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
============================
<eval_s {P}> G (seq S1 S2) G1
< AN2: apply A to _ Or2.
Subgoal 4.1:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
============================
<eval_s {P}> G (seq S1 S2) G1
< apply IH to R2 AN2.
Subgoal 4.1:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (seq S1 S2) G1
< Or3: case Or3.
Subgoal 4.1.1:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
============================
<eval_s {P}> G (seq S1 S2) G1
< AN3: apply A to _ Or3.
Subgoal 4.1.1:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_s {P}> G (seq S1 S2) G1
< apply IH to R3 AN3.
Subgoal 4.1.1:
Variables: N G G1 N2 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_s {P}> G2 S2 G1
============================
<eval_s {P}> G (seq S1 S2) G1
< search.
Subgoal 4.1.2:
Variables: N G G1 N2 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N **
H1 : is_integer N2
H2 : is_integer N
H3 : 0 <= N2
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (seq S1 S2) G1
< apply IH1 to R3 Acc.
Subgoal 4.1.2:
Variables: N G G1 N2 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : <eval_s {ES}> G S1 G2 N2 **
R3 : <eval_s {ES}> G2 S2 G1 N **
H1 : is_integer N2
H2 : is_integer N
H3 : 0 <= N2
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
H6 : <eval_s {P}> G2 S2 G1
============================
<eval_s {P}> G (seq S1 S2) G1
< search.
Subgoal 4.2:
Variables: N G G1 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
============================
<eval_s {P}> G (seq S1 S2) G1
< apply IH1 to R2 Acc.
Subgoal 4.2:
Variables: N G G1 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (seq S1 S2) G1
< Or3: case Or3.
Subgoal 4.2.1:
Variables: N G G1 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
============================
<eval_s {P}> G (seq S1 S2) G1
< AN3: apply A to _ Or3.
Subgoal 4.2.1:
Variables: N G G1 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_s {P}> G (seq S1 S2) G1
< apply IH to R3 AN3.
Subgoal 4.2.1:
Variables: N G G1 N3 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_s {P}> G2 S2 G1
============================
<eval_s {P}> G (seq S1 S2) G1
< search.
Subgoal 4.2.2:
Variables: N G G1 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N **
H1 : is_integer N
H2 : is_integer N
H3 : 0 <= N
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (seq S1 S2) G1
< apply IH1 to R3 Acc.
Subgoal 4.2.2:
Variables: N G G1 G2 S2 S1
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 (seq S1 S2) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : <eval_s {ES}> G S1 G2 N **
R3 : <eval_s {ES}> G2 S2 G1 N **
H1 : is_integer N
H2 : is_integer N
H3 : 0 <= N
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
H6 : <eval_s {P}> G2 S2 G1
============================
<eval_s {P}> G (seq S1 S2) G1
< search.
Subgoal 5:
Variables: N G G1 S2 S1 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 (ifte E S1 S2) G1 N @@
Acc : acc N @
R1 : eval_e G E trueE
R2 : <eval_s {ES}> G S1 G1 N **
============================
<eval_s {P}> G (ifte E S1 S2) G1
< apply IH1 to R2 Acc.
Subgoal 5:
Variables: N G G1 S2 S1 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 (ifte E S1 S2) G1 N @@
Acc : acc N @
R1 : eval_e G E trueE
R2 : <eval_s {ES}> G S1 G1 N **
H1 : <eval_s {P}> G S1 G1
============================
<eval_s {P}> G (ifte E S1 S2) G1
< search.
Subgoal 6:
Variables: N G G1 S2 S1 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 (ifte E S1 S2) G1 N @@
Acc : acc N @
R1 : eval_e G E falseE
R2 : <eval_s {ES}> G S2 G1 N **
============================
<eval_s {P}> G (ifte E S1 S2) G1
< apply IH1 to R2 Acc.
Subgoal 6:
Variables: N G G1 S2 S1 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 (ifte E S1 S2) G1 N @@
Acc : acc N @
R1 : eval_e G E falseE
R2 : <eval_s {ES}> G S2 G1 N **
H1 : <eval_s {P}> G S2 G1
============================
<eval_s {P}> G (ifte E S1 S2) G1
< search.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
============================
<eval_s {P}> G (while E S1) G1
< apply ext_size_is_int_eval_s to R3.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
============================
<eval_s {P}> G (while E S1) G1
< apply ext_size_is_int_eval_s to R4.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
============================
<eval_s {P}> G (while E S1) G1
< apply ext_size_pos_eval_s to R3.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
============================
<eval_s {P}> G (while E S1) G1
< apply ext_size_pos_eval_s to R4.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
============================
<eval_s {P}> G (while E S1) G1
< Or2: apply lt_left to R1 _ _.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
============================
<eval_s {P}> G (while E S1) G1
< Or3: apply lt_right to R1 _ _ _.
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
Or3 : N3 < N \/ N3 = N
============================
<eval_s {P}> G (while E S1) G1
< A: case Acc (keep).
Subgoal 7:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
============================
<eval_s {P}> G (while E S1) G1
< Or2: case Or2.
Subgoal 7.1:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
============================
<eval_s {P}> G (while E S1) G1
< AN2: apply A to _ Or2.
Subgoal 7.1:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
============================
<eval_s {P}> G (while E S1) G1
< apply IH to R3 AN2.
Subgoal 7.1:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (while E S1) G1
< Or3: case Or3.
Subgoal 7.1.1:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
============================
<eval_s {P}> G (while E S1) G1
< AN3: apply A to _ Or3.
Subgoal 7.1.1:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_s {P}> G (while E S1) G1
< apply IH to R4 AN3.
Subgoal 7.1.1:
Variables: N G G1 N2 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_s {P}> G2 (while E S1) G1
============================
<eval_s {P}> G (while E S1) G1
< search.
Subgoal 7.1.2:
Variables: N G G1 N2 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N **
H1 : is_integer N2
H2 : is_integer N
H3 : 0 <= N2
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (while E S1) G1
< apply IH1 to R4 Acc.
Subgoal 7.1.2:
Variables: N G G1 N2 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N2 **
R4 : <eval_s {ES}> G2 (while E S1) G1 N **
H1 : is_integer N2
H2 : is_integer N
H3 : 0 <= N2
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
Or2 : N2 < N
AN2 : acc N2 *
H5 : <eval_s {P}> G S1 G2
H6 : <eval_s {P}> G2 (while E S1) G1
============================
<eval_s {P}> G (while E S1) G1
< search.
Subgoal 7.2:
Variables: N G G1 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
============================
<eval_s {P}> G (while E S1) G1
< apply IH1 to R3 Acc.
Subgoal 7.2:
Variables: N G G1 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
Or3 : N3 < N \/ N3 = N
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (while E S1) G1
< Or3: case Or3.
Subgoal 7.2.1:
Variables: N G G1 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
============================
<eval_s {P}> G (while E S1) G1
< AN3: apply A to _ Or3.
Subgoal 7.2.1:
Variables: N G G1 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_s {P}> G (while E S1) G1
< apply IH to R4 AN3.
Subgoal 7.2.1:
Variables: N G G1 N3 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N3 **
H1 : is_integer N
H2 : is_integer N3
H3 : 0 <= N
H4 : 0 <= N3
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_s {P}> G2 (while E S1) G1
============================
<eval_s {P}> G (while E S1) G1
< search.
Subgoal 7.2.2:
Variables: N G G1 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N **
H1 : is_integer N
H2 : is_integer N
H3 : 0 <= N
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
============================
<eval_s {P}> G (while E S1) G1
< apply IH1 to R4 Acc.
Subgoal 7.2.2:
Variables: N G G1 G2 S1 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 (while E S1) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : eval_e G E trueE
R3 : <eval_s {ES}> G S1 G2 N **
R4 : <eval_s {ES}> G2 (while E S1) G1 N **
H1 : is_integer N
H2 : is_integer N
H3 : 0 <= N
H4 : 0 <= N
A : forall M, 0 <= M -> M < N -> acc M *
H5 : <eval_s {P}> G S1 G2
H6 : <eval_s {P}> G2 (while E S1) G1
============================
<eval_s {P}> G (while E S1) G1
< search.
Subgoal 8:
Variables: G1 S1 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}> G1 (while E S1) G1 0 @@
Acc : acc 0 @
R1 : eval_e G1 E falseE
============================
<eval_s {P}> G1 (while E S1) G1
< search.
Proof completed.
< Projection_Constraint proj_s_eval_results :
forall S S' G G1 G2 X V,
|{s}- S ~~> S' -> eval_s G S G1 -> eval_s G S' G2 -> lookup G1 X V -> lookup G2 X V.
Proof completed.
< Projection_Constraint proj_s_eval_results_back :
forall S S' G G1 G2 X V,
|{s}- S ~~> S' -> eval_s G S G1 -> eval_s G S' G2 -> lookup G2 X V -> lookup G1 X V.
Proof completed.
< Extensible_Theorem
eval_e_value : forall G E V,
Ev : eval_e G E V ->
AllVal : (forall X XV,
mem (X, XV) G -> value XV) ->
value V
on Ev.
Subgoal 1:
Variables: G V N
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 (var N) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : lookup G N V
============================
value V
< M: apply lookup_mem to Ev1.
Subgoal 1:
Variables: G V N
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 (var N) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : lookup G N V
M : mem (N, V) G
============================
value V
< apply AllVal to M.
Subgoal 1:
Variables: G V N
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 (var N) V @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : lookup G N V
M : mem (N, V) G
H1 : value V
============================
value V
< search.
Subgoal 2:
Variables: G I
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 (intlit I) (intlit I) @
AllVal : forall X XV, mem (X, XV) G -> value XV
============================
value (intlit I)
< search.
Subgoal 3:
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 trueE trueE @
AllVal : forall X XV, mem (X, XV) G -> value XV
============================
value trueE
< search.
Subgoal 4:
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 falseE falseE @
AllVal : forall X XV, mem (X, XV) G -> value XV
============================
value falseE
< search.
Subgoal 5:
Variables: G I1 I2 I 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 (add E1 E2) (intlit I) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 + I2 = I
============================
value (intlit I)
< search.
Subgoal 6:
Variables: G V2 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 (eq E1 E2) trueE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 V2 *
Ev2 : eval_e G E2 V2 *
============================
value trueE
< search.
Subgoal 7:
Variables: G V1 V2 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 (eq E1 E2) falseE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 V1 *
Ev2 : eval_e G E2 V2 *
Ev3 : V1 = V2 -> false
============================
value falseE
< search.
Subgoal 8:
Variables: G I1 I2 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 (gt E1 E2) trueE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 > I2
============================
value trueE
< search.
Subgoal 9:
Variables: G I1 I2 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 (gt E1 E2) falseE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 (intlit I1) *
Ev2 : eval_e G E2 (intlit I2) *
Ev3 : I1 <= I2
============================
value falseE
< search.
Subgoal 10:
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 (not E1) trueE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 falseE *
============================
value trueE
< search.
Subgoal 11:
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 (not E1) falseE @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E1 trueE *
============================
value falseE
< search.
Proof completed.
< Extensible_Theorem
eval_s_value : forall G S G' Y YV,
Ev : eval_s G S G' ->
AllVal : (forall X XV,
mem (X, XV) G -> value XV) ->
Mem : mem (Y, YV) G' ->
value YV
on Ev.
Subgoal 1:
Variables: G' Y YV
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' skipS G' @
AllVal : forall X XV, mem (X, XV) G' -> value XV
Mem : mem (Y, YV) G'
============================
value YV
< backchain AllVal.
Subgoal 2:
Variables: G Y YV V N E Ty
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 (decl N Ty E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((N, V)::G)
Ev1 : eval_e G E V
============================
value YV
< V: apply eval_e_value to Ev1 AllVal.
Subgoal 2:
Variables: G Y YV V N E Ty
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 (decl N Ty E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((N, V)::G)
Ev1 : eval_e G E V
V : value V
============================
value YV
< M: case Mem.
Subgoal 2.1:
Variables: G V N E Ty
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 (decl N Ty E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
V : value V
============================
value V
< search.
Subgoal 2.2:
Variables: G Y YV V N E Ty
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 (decl N Ty E) ((N, V)::G) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
V : value V
M : mem (Y, YV) G
============================
value YV
< backchain AllVal.
Subgoal 3:
Variables: G Y YV VOld NewG V N 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 (assign N E) ((N, V)::NewG) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((N, V)::NewG)
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
============================
value YV
< V: apply eval_e_value to Ev1 AllVal.
Subgoal 3:
Variables: G Y YV VOld NewG V N 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 (assign N E) ((N, V)::NewG) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) ((N, V)::NewG)
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
V : value V
============================
value YV
< M: case Mem.
Subgoal 3.1:
Variables: G VOld NewG V N 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 (assign N E) ((N, V)::NewG) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
V : value V
============================
value V
< search.
Subgoal 3.2:
Variables: G Y YV VOld NewG V N 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 (assign N E) ((N, V)::NewG) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
V : value V
M : mem (Y, YV) NewG
============================
value YV
< M': apply mem_after_select_before to Ev2 M.
Subgoal 3.2:
Variables: G Y YV VOld NewG V N 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 (assign N E) ((N, V)::NewG) @
AllVal : forall X XV, mem (X, XV) G -> value XV
Ev1 : eval_e G E V
Ev2 : select (N, VOld) NewG G
V : value V
M : mem (Y, YV) NewG
M' : mem (Y, YV) G
============================
value YV
< backchain AllVal.
Subgoal 4:
Variables: G G' Y YV G3 S2 S1
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 (seq S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_s G S1 G3 *
Ev2 : eval_s G3 S2 G' *
============================
value YV
< AllVal': assert forall X XV,
mem (X, XV) G3 -> value XV.
Subgoal 4.1:
Variables: G G' Y YV G3 S2 S1
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 (seq S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_s G S1 G3 *
Ev2 : eval_s G3 S2 G' *
============================
forall X XV, mem (X, XV) G3 -> value XV
< intros M.
Subgoal 4.1:
Variables: G G' Y YV G3 S2 S1 X XV
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 (seq S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_s G S1 G3 *
Ev2 : eval_s G3 S2 G' *
M : mem (X, XV) G3
============================
value XV
< apply IH to Ev1 AllVal M.
Subgoal 4.1:
Variables: G G' Y YV G3 S2 S1 X XV
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 (seq S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_s G S1 G3 *
Ev2 : eval_s G3 S2 G' *
M : mem (X, XV) G3
H1 : value XV
============================
value XV
< search.
Subgoal 4:
Variables: G G' Y YV G3 S2 S1
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 (seq S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_s G S1 G3 *
Ev2 : eval_s G3 S2 G' *
AllVal' : forall X XV, mem (X, XV) G3 -> value XV
============================
value YV
< apply IH to Ev2 AllVal' Mem.
Subgoal 4:
Variables: G G' Y YV G3 S2 S1
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 (seq S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_s G S1 G3 *
Ev2 : eval_s G3 S2 G' *
AllVal' : forall X XV, mem (X, XV) G3 -> value XV
H1 : value YV
============================
value YV
< search.
Subgoal 5:
Variables: G G' Y YV S2 S1 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 (ifte E S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G' *
============================
value YV
< apply IH to Ev2 AllVal Mem.
Subgoal 5:
Variables: G G' Y YV S2 S1 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 (ifte E S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G' *
H1 : value YV
============================
value YV
< search.
Subgoal 6:
Variables: G G' Y YV S2 S1 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 (ifte E S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G' *
============================
value YV
< apply IH to Ev2 AllVal Mem.
Subgoal 6:
Variables: G G' Y YV S2 S1 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 (ifte E S1 S2) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E falseE
Ev2 : eval_s G S2 G' *
H1 : value YV
============================
value YV
< search.
Subgoal 7:
Variables: G G' Y YV G3 S1 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 (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G3 *
Ev3 : eval_s G3 (while E S1) G' *
============================
value YV
< AllVal': assert forall X XV,
mem (X, XV) G3 -> value XV.
Subgoal 7.1:
Variables: G G' Y YV G3 S1 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 (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G3 *
Ev3 : eval_s G3 (while E S1) G' *
============================
forall X XV, mem (X, XV) G3 -> value XV
< intros M.
Subgoal 7.1:
Variables: G G' Y YV G3 S1 E X XV
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 (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G3 *
Ev3 : eval_s G3 (while E S1) G' *
M : mem (X, XV) G3
============================
value XV
< apply IH to Ev2 AllVal M.
Subgoal 7.1:
Variables: G G' Y YV G3 S1 E X XV
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 (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G3 *
Ev3 : eval_s G3 (while E S1) G' *
M : mem (X, XV) G3
H1 : value XV
============================
value XV
< search.
Subgoal 7:
Variables: G G' Y YV G3 S1 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 (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G3 *
Ev3 : eval_s G3 (while E S1) G' *
AllVal' : forall X XV, mem (X, XV) G3 -> value XV
============================
value YV
< apply IH to Ev3 AllVal' Mem.
Subgoal 7:
Variables: G G' Y YV G3 S1 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 (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G E trueE
Ev2 : eval_s G S1 G3 *
Ev3 : eval_s G3 (while E S1) G' *
AllVal' : forall X XV, mem (X, XV) G3 -> value XV
H1 : value YV
============================
value YV
< search.
Subgoal 8:
Variables: G' Y YV S1 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' (while E S1) G' @
AllVal : forall X XV, mem (X, XV) G' -> value XV
Mem : mem (Y, YV) G'
Ev1 : eval_e G' E falseE
============================
value YV
< backchain AllVal.
Proof completed.
< Theorem vars_equiv_left :
forall (G1 : list (pair (string) e)) G2 D D1 D2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
D1 ++ D2 = D -> forall X U1 U2,
mem X D1 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2.
============================
forall G1 G2 D D1 D2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> D1 ++ D2 = D ->
forall X U1 U2, mem X D1 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< intros Equiv J Mem Lkp1 Lkp2.
Variables: G1 G2 D D1 D2 X U1 U2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
J : D1 ++ D2 = D
Mem : mem X D1
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
============================
U1 = U2
< backchain Equiv to
X = X.
Variables: G1 G2 D D1 D2 X U1 U2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
J : D1 ++ D2 = D
Mem : mem X D1
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
============================
mem X D
< backchain mem_append_left.
Proof completed.
< Theorem vars_equiv_right :
forall (G1 : list (pair (string) e)) G2 D D1 D2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
D1 ++ D2 = D -> forall X U1 U2,
mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2.
============================
forall G1 G2 D D1 D2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) -> D1 ++ D2 = D ->
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< intros Equiv J Mem Lkp1 Lkp2.
Variables: G1 G2 D D1 D2 X U1 U2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
J : D1 ++ D2 = D
Mem : mem X D2
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
============================
U1 = U2
< backchain Equiv to
X = X.
Variables: G1 G2 D D1 D2 X U1 U2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
J : D1 ++ D2 = D
Mem : mem X D2
Lkp1 : lookup G1 X U1
Lkp2 : lookup G2 X U2
============================
mem X D
< backchain mem_append_right.
Proof completed.
< Extensible_Theorem
vars_eval_same_result : forall G1 G2 E D V1 V2,
Equiv : (forall X U1 U2,
mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
Vars : vars E D ->
Ev1 : eval_e G1 E V1 ->
Ev2 : eval_e G2 E V2 ->
V1 = V2
on Ev1.
Subgoal 1:
Variables: G1 G2 D V1 V2 N
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 (var N) D
Ev1 : eval_e G1 (var N) V1 @
Ev2 : eval_e G2 (var N) V2
Ev3 : lookup G1 N V1
============================
V1 = V2
< Ev2: case Ev2.
Subgoal 1:
Variables: G1 G2 D V1 V2 N
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 (var N) D
Ev1 : eval_e G1 (var N) V1 @
Ev3 : lookup G1 N V1
Ev2 : lookup G2 N V2
============================
V1 = V2
< case Vars.
Subgoal 1:
Variables: G1 G2 V1 V2 N
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 [N] -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (var N) V1 @
Ev3 : lookup G1 N V1
Ev2 : lookup G2 N V2
============================
V1 = V2
< apply Equiv to _ Ev3 Ev2.
Subgoal 1:
Variables: G1 G2 V2 N
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 [N] -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_e G1 (var N) V2 @
Ev3 : lookup G1 N V2
Ev2 : lookup G2 N V2
============================
V2 = V2
< search.
Subgoal 2:
Variables: G1 G2 D V2 I
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 (intlit I) D
Ev1 : eval_e G1 (intlit I) (intlit I) @
Ev2 : eval_e G2 (intlit I) V2
============================
intlit I = V2
< case Ev2.
Subgoal 2:
Variables: G1 G2 D I
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 (intlit I) D
Ev1 : eval_e G1 (intlit I) (intlit I) @
============================
intlit I = intlit I
< search.
Subgoal 3:
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 trueE D
Ev1 : eval_e G1 trueE trueE @
Ev2 : eval_e G2 trueE V2
============================
trueE = V2
< case Ev2.
Subgoal 3:
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 trueE D
Ev1 : eval_e G1 trueE trueE @
============================
trueE = trueE
< search.
Subgoal 4:
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 falseE D
Ev1 : eval_e G1 falseE falseE @
Ev2 : eval_e G2 falseE V2
============================
falseE = V2
< case Ev2.
Subgoal 4:
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 falseE D
Ev1 : eval_e G1 falseE falseE @
============================
falseE = falseE
< search.
Subgoal 5:
Variables: G1 G2 D V2 I1 I2 I 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 (add E1 E2) D
Ev1 : eval_e G1 (add E1 E2) (intlit I) @
Ev2 : eval_e G2 (add E1 E2) V2
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 + I2 = I
============================
intlit I = V2
< Ev2: case Ev2.
Subgoal 5:
Variables: G1 G2 D I1 I2 I E2 E1 I4 I5 I3
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 (add E1 E2) D
Ev1 : eval_e G1 (add E1 E2) (intlit I) @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
============================
intlit I = intlit I3
< Vars: case Vars.
Subgoal 5:
Variables: G1 G2 D I1 I2 I E2 E1 I4 I5 I3 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 (add E1 E2) (intlit I) @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
intlit I = intlit I3
< apply IH to _ Vars Ev3 Ev2.
Subgoal 5.1:
Variables: G1 G2 D I1 I2 I E2 E1 I4 I5 I3 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 (add E1 E2) (intlit I) @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
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 5:
Variables: G1 G2 D I2 I E2 E1 I4 I5 I3 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 (add E1 E2) (intlit I) @
Ev3 : eval_e G1 E1 (intlit I4) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I4 + I2 = I
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
intlit I = intlit I3
< apply IH to _ Vars1 Ev4 Ev6.
Subgoal 5.2:
Variables: G1 G2 D I2 I E2 E1 I4 I5 I3 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 (add E1 E2) (intlit I) @
Ev3 : eval_e G1 E1 (intlit I4) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I4 + I2 = I
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
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 5:
Variables: G1 G2 D I E2 E1 I4 I5 I3 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 (add E1 E2) (intlit I) @
Ev3 : eval_e G1 E1 (intlit I4) *
Ev4 : eval_e G1 E2 (intlit I5) *
Ev5 : I4 + I5 = I
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
intlit I = intlit I3
< apply plus_integer_unique to Ev5 Ev7.
Subgoal 5:
Variables: G1 G2 D E2 E1 I4 I5 I3 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 (add E1 E2) (intlit I3) @
Ev3 : eval_e G1 E1 (intlit I4) *
Ev4 : eval_e G1 E2 (intlit I5) *
Ev5 : I4 + I5 = I3
Ev2 : eval_e G2 E1 (intlit I4)
Ev6 : eval_e G2 E2 (intlit I5)
Ev7 : I4 + I5 = I3
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
intlit I3 = intlit I3
< search.
Subgoal 6:
Variables: G1 G2 D V2 V4 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 (eq E1 E2) D
Ev1 : eval_e G1 (eq E1 E2) trueE @
Ev2 : eval_e G2 (eq E1 E2) V2
Ev3 : eval_e G1 E1 V4 *
Ev4 : eval_e G1 E2 V4 *
============================
trueE = V2
< Ev2: case Ev2.
Subgoal 6.1:
Variables: G1 G2 D V4 E2 E1 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 (eq E1 E2) D
Ev1 : eval_e G1 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V4 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V6
Ev5 : eval_e G2 E2 V6
============================
trueE = trueE
< search.
Subgoal 6.2:
Variables: G1 G2 D V4 E2 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 (eq E1 E2) D
Ev1 : eval_e G1 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V4 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Ev6 : V5 = V6 -> false
============================
trueE = falseE
< Vars: case Vars.
Subgoal 6.2:
Variables: G1 G2 D V4 E2 E1 V5 V6 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 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V4 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Ev6 : V5 = V6 -> false
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
trueE = falseE
< apply IH to _ Vars Ev3 Ev2.
Subgoal 6.2.1:
Variables: G1 G2 D V4 E2 E1 V5 V6 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 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V4 *
Ev4 : eval_e G1 E2 V4 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Ev6 : V5 = V6 -> false
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 6.2:
Variables: G1 G2 D E2 E1 V5 V6 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 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V5 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Ev6 : V5 = V6 -> false
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
trueE = falseE
< apply IH to _ Vars1 Ev4 Ev5.
Subgoal 6.2.2:
Variables: G1 G2 D E2 E1 V5 V6 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 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V5 *
Ev2 : eval_e G2 E1 V5
Ev5 : eval_e G2 E2 V6
Ev6 : V5 = V6 -> false
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 6.2:
Variables: G1 G2 D E2 E1 V6 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 (eq E1 E2) trueE @
Ev3 : eval_e G1 E1 V6 *
Ev4 : eval_e G1 E2 V6 *
Ev2 : eval_e G2 E1 V6
Ev5 : eval_e G2 E2 V6
Ev6 : V6 = V6 -> false
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
trueE = falseE
< apply Ev6 to _.
Subgoal 7:
Variables: G1 G2 D V2 V3 V4 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 (eq E1 E2) D
Ev1 : eval_e G1 (eq E1 E2) falseE @
Ev2 : eval_e G2 (eq E1 E2) V2
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V3 = V4 -> false
============================
falseE = V2
< Ev2: case Ev2.
Subgoal 7.1:
Variables: G1 G2 D V3 V4 E2 E1 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 (eq E1 E2) D
Ev1 : eval_e G1 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V3 = V4 -> false
Ev2 : eval_e G2 E1 V6
Ev6 : eval_e G2 E2 V6
============================
falseE = trueE
< Vars: case Vars.
Subgoal 7.1:
Variables: G1 G2 D V3 V4 E2 E1 V6 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 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V3 = V4 -> false
Ev2 : eval_e G2 E1 V6
Ev6 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
falseE = trueE
< apply IH to _ Vars Ev3 Ev2.
Subgoal 7.1.1:
Variables: G1 G2 D V3 V4 E2 E1 V6 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 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V3 = V4 -> false
Ev2 : eval_e G2 E1 V6
Ev6 : 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 7.1:
Variables: G1 G2 D V4 E2 E1 V6 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 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V6 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V6 = V4 -> false
Ev2 : eval_e G2 E1 V6
Ev6 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
falseE = trueE
< apply IH to _ Vars1 Ev4 Ev6.
Subgoal 7.1.2:
Variables: G1 G2 D V4 E2 E1 V6 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 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V6 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V6 = V4 -> false
Ev2 : eval_e G2 E1 V6
Ev6 : 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 7.1:
Variables: G1 G2 D E2 E1 V6 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 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V6 *
Ev4 : eval_e G1 E2 V6 *
Ev5 : V6 = V6 -> false
Ev2 : eval_e G2 E1 V6
Ev6 : eval_e G2 E2 V6
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
falseE = trueE
< apply Ev5 to _.
Subgoal 7.2:
Variables: G1 G2 D V3 V4 E2 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 (eq E1 E2) D
Ev1 : eval_e G1 (eq E1 E2) falseE @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : V3 = V4 -> false
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : V5 = V6 -> false
============================
falseE = falseE
< search.
Subgoal 8:
Variables: G1 G2 D V2 I1 I2 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 (gt E1 E2) D
Ev1 : eval_e G1 (gt E1 E2) trueE @
Ev2 : eval_e G2 (gt E1 E2) V2
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 > I2
============================
trueE = V2
< Ev2: case Ev2.
Subgoal 8.1:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4
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 (gt E1 E2) D
Ev1 : eval_e G1 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 > I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
============================
trueE = trueE
< search.
Subgoal 8.2:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4
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 (gt E1 E2) D
Ev1 : eval_e G1 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 > I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
============================
trueE = falseE
< Vars: case Vars.
Subgoal 8.2:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4 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 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 > I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
trueE = falseE
< apply IH to _ Vars Ev3 Ev2.
Subgoal 8.2.1:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4 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 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 > I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
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 8.2:
Variables: G1 G2 D I2 E2 E1 I3 I4 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 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I3) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I3 > I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
trueE = falseE
< apply IH to _ Vars1 Ev4 Ev6.
Subgoal 8.2.2:
Variables: G1 G2 D I2 E2 E1 I3 I4 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 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I3) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I3 > I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
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 8.2:
Variables: G1 G2 D E2 E1 I3 I4 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 (gt E1 E2) trueE @
Ev3 : eval_e G1 E1 (intlit I3) *
Ev4 : eval_e G1 E2 (intlit I4) *
Ev5 : I3 > I4
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
trueE = falseE
< apply greater_lesseq_integer_false to Ev5 Ev7.
Subgoal 9:
Variables: G1 G2 D V2 I1 I2 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 (gt E1 E2) D
Ev1 : eval_e G1 (gt E1 E2) falseE @
Ev2 : eval_e G2 (gt E1 E2) V2
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 <= I2
============================
falseE = V2
< Ev2: case Ev2.
Subgoal 9.1:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4
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 (gt E1 E2) D
Ev1 : eval_e G1 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
============================
falseE = trueE
< Vars: case Vars.
Subgoal 9.1:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4 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 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
falseE = trueE
< apply IH to _ Vars Ev3 Ev2.
Subgoal 9.1.1:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4 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 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
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 9.1:
Variables: G1 G2 D I2 E2 E1 I3 I4 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 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I3) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I3 <= I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
falseE = trueE
< apply IH to _ Vars1 Ev4 Ev6.
Subgoal 9.1.2:
Variables: G1 G2 D I2 E2 E1 I3 I4 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 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I3) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I3 <= I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
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 9.1:
Variables: G1 G2 D E2 E1 I3 I4 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 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I3) *
Ev4 : eval_e G1 E2 (intlit I4) *
Ev5 : I3 <= I4
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 > I4
Vars : vars E1 Vr1
Vars1 : vars E2 Vr2
Vars2 : Vr1 ++ Vr2 = D
============================
falseE = trueE
< apply greater_lesseq_integer_false to Ev7 Ev5.
Subgoal 9.2:
Variables: G1 G2 D I1 I2 E2 E1 I3 I4
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 (gt E1 E2) D
Ev1 : eval_e G1 (gt E1 E2) falseE @
Ev3 : eval_e G1 E1 (intlit I1) *
Ev4 : eval_e G1 E2 (intlit I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G2 E1 (intlit I3)
Ev6 : eval_e G2 E2 (intlit I4)
Ev7 : I3 <= I4
============================
falseE = falseE
< search.
Subgoal 10:
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 (not E1) D
Ev1 : eval_e G1 (not E1) trueE @
Ev2 : eval_e G2 (not E1) V2
Ev3 : eval_e G1 E1 falseE *
============================
trueE = V2
< Ev2: case Ev2.
Subgoal 10.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 (not E1) D
Ev1 : eval_e G1 (not E1) trueE @
Ev3 : eval_e G1 E1 falseE *
Ev2 : eval_e G2 E1 falseE
============================
trueE = trueE
< search.
Subgoal 10.2:
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 (not E1) D
Ev1 : eval_e G1 (not E1) trueE @
Ev3 : eval_e G1 E1 falseE *
Ev2 : eval_e G2 E1 trueE
============================
trueE = falseE
< Vars: case Vars.
Subgoal 10.2:
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
Ev1 : eval_e G1 (not E1) trueE @
Ev3 : eval_e G1 E1 falseE *
Ev2 : eval_e G2 E1 trueE
Vars : vars E1 D
============================
trueE = falseE
< apply IH to _ _ Ev3 Ev2.
Subgoal 11:
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 (not E1) D
Ev1 : eval_e G1 (not E1) falseE @
Ev2 : eval_e G2 (not E1) V2
Ev3 : eval_e G1 E1 trueE *
============================
falseE = V2
< Ev2: case Ev2.
Subgoal 11.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 (not E1) D
Ev1 : eval_e G1 (not E1) falseE @
Ev3 : eval_e G1 E1 trueE *
Ev2 : eval_e G2 E1 falseE
============================
falseE = trueE
< Vars: case Vars.
Subgoal 11.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
Ev1 : eval_e G1 (not E1) falseE @
Ev3 : eval_e G1 E1 trueE *
Ev2 : eval_e G2 E1 falseE
Vars : vars E1 D
============================
falseE = trueE
< apply IH to _ _ Ev3 Ev2.
Subgoal 11.2:
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 (not E1) D
Ev1 : eval_e G1 (not E1) falseE @
Ev3 : eval_e G1 E1 trueE *
Ev2 : eval_e G2 E1 trueE
============================
falseE = falseE
< search.
Proof completed.