< 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.