< Module simple_imp: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_rf_unique :
forall RF RF1 RF2,
|{recFieldExprs}- RF ~~> RF1 -> |{recFieldExprs}- RF ~~> RF2 -> RF1 = RF2.
Proof completed.
< Projection_Constraint proj_rf_is :
forall RF RF',
|{recFieldExprs}- RF ~~> RF' -> is_recFieldExprs RF -> is_recFieldExprs RF'.
Proof completed.
< Projection_Constraint proj_c_unique :
forall C C1 C2,
|{c}- C ~~> C1 -> |{c}- C ~~> C2 -> C1 = C2.
Proof completed.
< Projection_Constraint proj_c_is :
forall C C',
|{c}- C ~~> C' -> is_c C -> is_c C'.
Proof completed.
< Projection_Constraint proj_recFields_unique :
forall RF RF1 RF2,
|{recFields}- RF ~~> RF1 -> |{recFields}- RF ~~> RF2 -> RF1 = RF2.
Proof completed.
< Projection_Constraint proj_recFields_is :
forall RF RF',
|{recFields}- RF ~~> RF' -> is_recFields RF -> is_recFields RF'.
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.
< Projection_Constraint proj_value_unique :
forall V V1 V2,
|{value}- V ~~> V1 -> |{value}- V ~~> V2 -> V1 = V2.
Proof completed.
< Projection_Constraint proj_value_is :
forall V V',
|{value}- V ~~> V' -> is_value V -> is_value V'.
Proof completed.
< Extensible_Theorem
vars_join : forall E V D,
Vars : vars E V ->
exists D',
V ++ D = D'
on Vars,
vars_rf_join : forall RF V D,
Vars : vars_rf RF V ->
exists D',
V ++ D = D'
on Vars.
Subgoal 1.1:
Variables: D I
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (num I) [] @
============================
exists D', [] ++ D = D'
< search.
Subgoal 1.2:
Variables: V D D2 D3 E2 E1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
============================
exists D', V ++ D = D'
< J2: apply IH to Vars2 with
D = D.
Subgoal 1.2:
Variables: V D D2 D3 E2 E1 D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
============================
exists D', V ++ D = D'
< J1: apply IH to Vars1 with
D = D'.
Subgoal 1.2:
Variables: V D D2 D3 E2 E1 D' D'1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
============================
exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1.
Subgoal 1.2:
Variables: V D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', V ++ D = D'
< apply append_unique to Vars3 JApp.
Subgoal 1.2:
Variables: D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (plus E1 E2) L12 @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = L12
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', L12 ++ D = D'
< search.
Subgoal 1.3:
Variables: D X
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (name X) [X] @
============================
exists D', [X] ++ D = D'
< search.
Subgoal 1.4:
Variables: V D D2 D3 E2 E1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
============================
exists D', V ++ D = D'
< J2: apply IH to Vars2 with
D = D.
Subgoal 1.4:
Variables: V D D2 D3 E2 E1 D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
============================
exists D', V ++ D = D'
< J1: apply IH to Vars1 with
D = D'.
Subgoal 1.4:
Variables: V D D2 D3 E2 E1 D' D'1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
============================
exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1.
Subgoal 1.4:
Variables: V D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', V ++ D = D'
< apply append_unique to Vars3 JApp.
Subgoal 1.4:
Variables: D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (greater E1 E2) L12 @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = L12
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', L12 ++ D = D'
< search.
Subgoal 1.5:
Variables: V D D2 D3 E2 E1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
============================
exists D', V ++ D = D'
< J2: apply IH to Vars2 with
D = D.
Subgoal 1.5:
Variables: V D D2 D3 E2 E1 D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
============================
exists D', V ++ D = D'
< J1: apply IH to Vars1 with
D = D'.
Subgoal 1.5:
Variables: V D D2 D3 E2 E1 D' D'1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
============================
exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1.
Subgoal 1.5:
Variables: V D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', V ++ D = D'
< apply append_unique to Vars3 JApp.
Subgoal 1.5:
Variables: D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (eq E1 E2) L12 @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = L12
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', L12 ++ D = D'
< search.
Subgoal 1.6:
Variables: V D D2 D3 E2 E1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
============================
exists D', V ++ D = D'
< J2: apply IH to Vars2 with
D = D.
Subgoal 1.6:
Variables: V D D2 D3 E2 E1 D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
============================
exists D', V ++ D = D'
< J1: apply IH to Vars1 with
D = D'.
Subgoal 1.6:
Variables: V D D2 D3 E2 E1 D' D'1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
============================
exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1.
Subgoal 1.6:
Variables: V D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', V ++ D = D'
< apply append_unique to Vars3 JApp.
Subgoal 1.6:
Variables: D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (and E1 E2) L12 @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = L12
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', L12 ++ D = D'
< search.
Subgoal 1.7:
Variables: V D D2 D3 E2 E1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
============================
exists D', V ++ D = D'
< J2: apply IH to Vars2 with
D = D.
Subgoal 1.7:
Variables: V D D2 D3 E2 E1 D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
============================
exists D', V ++ D = D'
< J1: apply IH to Vars1 with
D = D'.
Subgoal 1.7:
Variables: V D D2 D3 E2 E1 D' D'1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
============================
exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1.
Subgoal 1.7:
Variables: V D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = V
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', V ++ D = D'
< apply append_unique to Vars3 JApp.
Subgoal 1.7:
Variables: D D2 D3 E2 E1 D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (or E1 E2) L12 @
Vars1 : vars E1 D2 *
Vars2 : vars E2 D3 *
Vars3 : D2 ++ D3 = L12
J2 : D3 ++ D = D'
J1 : D2 ++ D' = D'1
JApp : D2 ++ D3 = L12
JApp1 : L12 ++ D = D'1
============================
exists D', L12 ++ D = D'
< search.
Subgoal 1.8:
Variables: D
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars true [] @
============================
exists D', [] ++ D = D'
< search.
Subgoal 1.9:
Variables: D
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars false [] @
============================
exists D', [] ++ D = D'
< search.
Subgoal 1.10:
Variables: V D Fields
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (recBuild Fields) V @
Vars1 : vars_rf Fields V *
============================
exists D', V ++ D = D'
< apply IH1 to Vars1 with
D = D.
Subgoal 1.10:
Variables: V D Fields D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (recBuild Fields) V @
Vars1 : vars_rf Fields V *
H1 : V ++ D = D'
============================
exists D', V ++ D = D'
< search.
Subgoal 1.11:
Variables: V D Field Rec
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (recFieldAccess Rec Field) V @
Vars1 : vars Rec V *
============================
exists D', V ++ D = D'
< apply IH to Vars1 with
D = D.
Subgoal 1.11:
Variables: V D Field Rec D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars (recFieldAccess Rec Field) V @
Vars1 : vars Rec V *
H1 : V ++ D = D'
============================
exists D', V ++ D = D'
< search.
Subgoal 2.1:
Variables: D
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars_rf endRecFieldExprs [] @
============================
exists D', [] ++ D = D'
< search.
Subgoal 2.2:
Variables: V D DRest DE Rest E X
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
============================
exists D', V ++ D = D'
< J2: apply IH1 to Vars1 with
D = D.
Subgoal 2.2:
Variables: V D DRest DE Rest E X D'
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
J2 : DRest ++ D = D'
============================
exists D', V ++ D = D'
< J1: apply IH to Vars2 with
D = D'.
Subgoal 2.2:
Variables: V D DRest DE Rest E X D' D'1
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
J2 : DRest ++ D = D'
J1 : DE ++ D' = D'1
============================
exists D', V ++ D = D'
< JApp: apply append_associative_back to J2 J1.
Subgoal 2.2:
Variables: V D DRest DE Rest E X D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
J2 : DRest ++ D = D'
J1 : DE ++ D' = D'1
JApp : DE ++ DRest = L12
JApp1 : L12 ++ D = D'1
============================
exists D', V ++ D = D'
< apply append_unique to Vars3 JApp.
Subgoal 2.2:
Variables: D DRest DE Rest E X D' D'1 L12
IH : forall E V D, vars E V * -> exists D', V ++ D = D'
IH1 : forall RF V D, vars_rf RF V * -> exists D', V ++ D = D'
Vars : vars_rf (addRecFieldExprs X E Rest) L12 @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = L12
J2 : DRest ++ D = D'
J1 : DE ++ D' = D'1
JApp : DE ++ DRest = L12
JApp1 : L12 ++ D = D'1
============================
exists D', L12 ++ D = D'
< search.
Proof completed.
< Extensible_Theorem
vars_unique : forall E V1 V2,
Vars1 : vars E V1 ->
Vars2 : vars E V2 ->
V1 = V2
on Vars1,
vars_rf_unique : forall RF V1 V2,
Vars1 : vars_rf RF V1 ->
Vars2 : vars_rf RF V2 ->
V1 = V2
on Vars1.
Subgoal 1.1:
Variables: V2 I
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (num I) [] @
Vars2 : vars (num I) V2
============================
[] = V2
< case Vars2.
Subgoal 1.1:
Variables: I
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (num I) [] @
============================
[] = []
< search.
Subgoal 1.2:
Variables: V1 V2 D1 D2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (plus E1 E2) V1 @
Vars2 : vars (plus E1 E2) V2
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.2:
Variables: V1 V2 D1 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (plus E1 E2) V1 @
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars3 Vars2.
Subgoal 1.2:
Variables: V1 V2 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (plus E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D2 *
Vars5 : D3 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars4 Vars6.
Subgoal 1.2:
Variables: V1 V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (plus E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply append_unique to Vars5 Vars7.
Subgoal 1.2:
Variables: V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (plus E1 E2) V2 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V2
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V2 = V2
< search.
Subgoal 1.3:
Variables: V2 X
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (name X) [X] @
Vars2 : vars (name X) V2
============================
[X] = V2
< case Vars2.
Subgoal 1.3:
Variables: X
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (name X) [X] @
============================
[X] = [X]
< search.
Subgoal 1.4:
Variables: V1 V2 D1 D2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (greater E1 E2) V1 @
Vars2 : vars (greater E1 E2) V2
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.4:
Variables: V1 V2 D1 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (greater E1 E2) V1 @
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars3 Vars2.
Subgoal 1.4:
Variables: V1 V2 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (greater E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D2 *
Vars5 : D3 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars4 Vars6.
Subgoal 1.4:
Variables: V1 V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (greater E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply append_unique to Vars5 Vars7.
Subgoal 1.4:
Variables: V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (greater E1 E2) V2 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V2
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V2 = V2
< search.
Subgoal 1.5:
Variables: V1 V2 D1 D2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (eq E1 E2) V1 @
Vars2 : vars (eq E1 E2) V2
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.5:
Variables: V1 V2 D1 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (eq E1 E2) V1 @
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars3 Vars2.
Subgoal 1.5:
Variables: V1 V2 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (eq E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D2 *
Vars5 : D3 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars4 Vars6.
Subgoal 1.5:
Variables: V1 V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (eq E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply append_unique to Vars5 Vars7.
Subgoal 1.5:
Variables: V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (eq E1 E2) V2 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V2
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V2 = V2
< search.
Subgoal 1.6:
Variables: V1 V2 D1 D2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (and E1 E2) V1 @
Vars2 : vars (and E1 E2) V2
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.6:
Variables: V1 V2 D1 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (and E1 E2) V1 @
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars3 Vars2.
Subgoal 1.6:
Variables: V1 V2 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (and E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D2 *
Vars5 : D3 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars4 Vars6.
Subgoal 1.6:
Variables: V1 V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (and E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply append_unique to Vars5 Vars7.
Subgoal 1.6:
Variables: V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (and E1 E2) V2 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V2
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V2 = V2
< search.
Subgoal 1.7:
Variables: V1 V2 D1 D2 E2 E1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (or E1 E2) V1 @
Vars2 : vars (or E1 E2) V2
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.7:
Variables: V1 V2 D1 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (or E1 E2) V1 @
Vars3 : vars E1 D1 *
Vars4 : vars E2 D2 *
Vars5 : D1 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars3 Vars2.
Subgoal 1.7:
Variables: V1 V2 D2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (or E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D2 *
Vars5 : D3 ++ D2 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply IH to Vars4 Vars6.
Subgoal 1.7:
Variables: V1 V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (or E1 E2) V1 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V1
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V1 = V2
< apply append_unique to Vars5 Vars7.
Subgoal 1.7:
Variables: V2 E2 E1 D3 D4
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (or E1 E2) V2 @
Vars3 : vars E1 D3 *
Vars4 : vars E2 D4 *
Vars5 : D3 ++ D4 = V2
Vars2 : vars E1 D3
Vars6 : vars E2 D4
Vars7 : D3 ++ D4 = V2
============================
V2 = V2
< search.
Subgoal 1.8:
Variables: V2
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars true [] @
Vars2 : vars true V2
============================
[] = V2
< case Vars2.
Subgoal 1.8:
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars true [] @
============================
[] = []
< search.
Subgoal 1.9:
Variables: V2
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars false [] @
Vars2 : vars false V2
============================
[] = V2
< case Vars2.
Subgoal 1.9:
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars false [] @
============================
[] = []
< search.
Subgoal 1.10:
Variables: V1 V2 Fields
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (recBuild Fields) V1 @
Vars2 : vars (recBuild Fields) V2
Vars3 : vars_rf Fields V1 *
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.10:
Variables: V1 V2 Fields
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (recBuild Fields) V1 @
Vars3 : vars_rf Fields V1 *
Vars2 : vars_rf Fields V2
============================
V1 = V2
< apply IH1 to Vars3 Vars2.
Subgoal 1.10:
Variables: V2 Fields
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (recBuild Fields) V2 @
Vars3 : vars_rf Fields V2 *
Vars2 : vars_rf Fields V2
============================
V2 = V2
< search.
Subgoal 1.11:
Variables: V1 V2 Field Rec
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (recFieldAccess Rec Field) V1 @
Vars2 : vars (recFieldAccess Rec Field) V2
Vars3 : vars Rec V1 *
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 1.11:
Variables: V1 V2 Field Rec
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (recFieldAccess Rec Field) V1 @
Vars3 : vars Rec V1 *
Vars2 : vars Rec V2
============================
V1 = V2
< apply IH to Vars3 Vars2.
Subgoal 1.11:
Variables: V2 Field Rec
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars (recFieldAccess Rec Field) V2 @
Vars3 : vars Rec V2 *
Vars2 : vars Rec V2
============================
V2 = V2
< search.
Subgoal 2.1:
Variables: V2
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf endRecFieldExprs [] @
Vars2 : vars_rf endRecFieldExprs V2
============================
[] = V2
< case Vars2.
Subgoal 2.1:
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf endRecFieldExprs [] @
============================
[] = []
< search.
Subgoal 2.2:
Variables: V1 V2 DRest DE Rest E X
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf (addRecFieldExprs X E Rest) V1 @
Vars2 : vars_rf (addRecFieldExprs X E Rest) V2
Vars3 : vars_rf Rest DRest *
Vars4 : vars E DE *
Vars5 : DE ++ DRest = V1
============================
V1 = V2
< Vars2: case Vars2.
Subgoal 2.2:
Variables: V1 V2 DRest DE Rest E X DRest1 DE1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf (addRecFieldExprs X E Rest) V1 @
Vars3 : vars_rf Rest DRest *
Vars4 : vars E DE *
Vars5 : DE ++ DRest = V1
Vars2 : vars_rf Rest DRest1
Vars6 : vars E DE1
Vars7 : DE1 ++ DRest1 = V2
============================
V1 = V2
< apply IH to Vars4 Vars6.
Subgoal 2.2:
Variables: V1 V2 DRest Rest E X DRest1 DE1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf (addRecFieldExprs X E Rest) V1 @
Vars3 : vars_rf Rest DRest *
Vars4 : vars E DE1 *
Vars5 : DE1 ++ DRest = V1
Vars2 : vars_rf Rest DRest1
Vars6 : vars E DE1
Vars7 : DE1 ++ DRest1 = V2
============================
V1 = V2
< apply IH1 to Vars3 Vars2.
Subgoal 2.2:
Variables: V1 V2 Rest E X DRest1 DE1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf (addRecFieldExprs X E Rest) V1 @
Vars3 : vars_rf Rest DRest1 *
Vars4 : vars E DE1 *
Vars5 : DE1 ++ DRest1 = V1
Vars2 : vars_rf Rest DRest1
Vars6 : vars E DE1
Vars7 : DE1 ++ DRest1 = V2
============================
V1 = V2
< apply append_unique to Vars5 Vars7.
Subgoal 2.2:
Variables: V2 Rest E X DRest1 DE1
IH : forall E V1 V2, vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall RF V1 V2, vars_rf RF V1 * -> vars_rf RF V2 -> V1 = V2
Vars1 : vars_rf (addRecFieldExprs X E Rest) V2 @
Vars3 : vars_rf Rest DRest1 *
Vars4 : vars E DE1 *
Vars5 : DE1 ++ DRest1 = V2
Vars2 : vars_rf Rest DRest1
Vars6 : vars E DE1
Vars7 : DE1 ++ DRest1 = 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.
< Projection_Constraint proj_rf_vars_exist :
forall RF RF' V,
|{recFieldExprs}- RF ~~> RF' -> vars_rf RF V -> exists V', vars_rf RF' V'.
Proof completed.
< Projection_Constraint proj_rf_vars :
forall RF RF' V V' X,
|{recFieldExprs}- RF ~~> RF' -> vars_rf RF V -> vars_rf RF' 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,
vars_rf_is : forall RF V,
IsRF : is_recFieldExprs RF ->
Vars : vars_rf RF V ->
is_list is_string V
on Vars.
Subgoal 1.1:
Variables: I
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (num I)
Vars : vars (num I) [] @
============================
is_list is_string []
< search.
Subgoal 1.2:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (plus E1 E2)
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
============================
is_list is_string V
< IsE1: case IsE.
Subgoal 1.2:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
============================
is_list is_string V
< IsD1: apply IH to IsE1 Vars1.
Subgoal 1.2:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
============================
is_list is_string V
< IsD2: apply IH to IsE2 Vars2.
Subgoal 1.2:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
============================
is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3.
Subgoal 1.2:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (plus E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 1.3:
Variables: X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (name X)
Vars : vars (name X) [X] @
============================
is_list is_string [X]
< case IsE.
Subgoal 1.3:
Variables: X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (name X) [X] @
H1 : is_string X
============================
is_list is_string [X]
< search.
Subgoal 1.4:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (greater E1 E2)
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
============================
is_list is_string V
< IsE1: case IsE.
Subgoal 1.4:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
============================
is_list is_string V
< IsD1: apply IH to IsE1 Vars1.
Subgoal 1.4:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
============================
is_list is_string V
< IsD2: apply IH to IsE2 Vars2.
Subgoal 1.4:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
============================
is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3.
Subgoal 1.4:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (greater E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 1.5:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (eq E1 E2)
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
============================
is_list is_string V
< IsE1: case IsE.
Subgoal 1.5:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
============================
is_list is_string V
< IsD1: apply IH to IsE1 Vars1.
Subgoal 1.5:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
============================
is_list is_string V
< IsD2: apply IH to IsE2 Vars2.
Subgoal 1.5:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
============================
is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3.
Subgoal 1.5:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (eq E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 1.6:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (and E1 E2)
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
============================
is_list is_string V
< IsE1: case IsE.
Subgoal 1.6:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
============================
is_list is_string V
< IsD1: apply IH to IsE1 Vars1.
Subgoal 1.6:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
============================
is_list is_string V
< IsD2: apply IH to IsE2 Vars2.
Subgoal 1.6:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
============================
is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3.
Subgoal 1.6:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (and E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 1.7:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (or E1 E2)
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
============================
is_list is_string V
< IsE1: case IsE.
Subgoal 1.7:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
============================
is_list is_string V
< IsD1: apply IH to IsE1 Vars1.
Subgoal 1.7:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
============================
is_list is_string V
< IsD2: apply IH to IsE2 Vars2.
Subgoal 1.7:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
============================
is_list is_string V
< apply append__is_list__is_string to IsD1 IsD2 Vars3.
Subgoal 1.7:
Variables: V D1 D2 E2 E1
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (or E1 E2) V @
Vars1 : vars E1 D1 *
Vars2 : vars E2 D2 *
Vars3 : D1 ++ D2 = V
IsE1 : is_e E1
IsE2 : is_e E2
IsD1 : is_list is_string D1
IsD2 : is_list is_string D2
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 1.8:
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e true
Vars : vars true [] @
============================
is_list is_string []
< search.
Subgoal 1.9:
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e false
Vars : vars false [] @
============================
is_list is_string []
< search.
Subgoal 1.10:
Variables: V Fields
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (recBuild Fields)
Vars : vars (recBuild Fields) V @
Vars1 : vars_rf Fields V *
============================
is_list is_string V
< IsRF: case IsE.
Subgoal 1.10:
Variables: V Fields
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (recBuild Fields) V @
Vars1 : vars_rf Fields V *
IsRF : is_recFieldExprs Fields
============================
is_list is_string V
< apply IH1 to IsRF Vars1.
Subgoal 1.10:
Variables: V Fields
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (recBuild Fields) V @
Vars1 : vars_rf Fields V *
IsRF : is_recFieldExprs Fields
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 1.11:
Variables: V Field Rec
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsE : is_e (recFieldAccess Rec Field)
Vars : vars (recFieldAccess Rec Field) V @
Vars1 : vars Rec V *
============================
is_list is_string V
< IsE: case IsE.
Subgoal 1.11:
Variables: V Field Rec
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (recFieldAccess Rec Field) V @
Vars1 : vars Rec V *
IsE : is_e Rec
IsE1 : is_string Field
============================
is_list is_string V
< apply IH to IsE Vars1.
Subgoal 1.11:
Variables: V Field Rec
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars (recFieldAccess Rec Field) V @
Vars1 : vars Rec V *
IsE : is_e Rec
IsE1 : is_string Field
H1 : is_list is_string V
============================
is_list is_string V
< search.
Subgoal 2.1:
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsRF : is_recFieldExprs endRecFieldExprs
Vars : vars_rf endRecFieldExprs [] @
============================
is_list is_string []
< search.
Subgoal 2.2:
Variables: V DRest DE Rest E X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
IsRF : is_recFieldExprs (addRecFieldExprs X E Rest)
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
============================
is_list is_string V
< IsRF: case IsRF.
Subgoal 2.2:
Variables: V DRest DE Rest E X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
IsRF : is_string X
IsRF1 : is_e E
IsRF2 : is_recFieldExprs Rest
============================
is_list is_string V
< IsDE: apply IH to IsRF1 Vars2.
Subgoal 2.2:
Variables: V DRest DE Rest E X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
IsRF : is_string X
IsRF1 : is_e E
IsRF2 : is_recFieldExprs Rest
IsDE : is_list is_string DE
============================
is_list is_string V
< IsDRest: apply IH1 to IsRF2 Vars1.
Subgoal 2.2:
Variables: V DRest DE Rest E X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
IsRF : is_string X
IsRF1 : is_e E
IsRF2 : is_recFieldExprs Rest
IsDE : is_list is_string DE
IsDRest : is_list is_string DRest
============================
is_list is_string V
< apply append__is_list__is_string to IsDE IsDRest Vars3.
Subgoal 2.2:
Variables: V DRest DE Rest E X
IH : forall E V, is_e E -> vars E V * -> is_list is_string V
IH1 : forall RF V, is_recFieldExprs RF -> vars_rf RF V * -> is_list is_string V
Vars : vars_rf (addRecFieldExprs X E Rest) V @
Vars1 : vars_rf Rest DRest *
Vars2 : vars E DE *
Vars3 : DE ++ DRest = V
IsRF : is_string X
IsRF1 : is_e E
IsRF2 : is_recFieldExprs Rest
IsDE : is_list is_string DE
IsDRest : is_list is_string DRest
H1 : 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,
vars_rf_exist : forall RF,
IsRF : is_recFieldExprs RF ->
exists V,
vars_rf RF V
on IsRF.
Subgoal 1.1:
Variables: I
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (num I) @
IsE1 : is_integer I
============================
exists V, vars (num I) V
< search.
Subgoal 1.2:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (plus E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (plus E1 E2) V
< Vars1: apply IH to IsE1.
Subgoal 1.2:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (plus E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
============================
exists V, vars (plus E1 E2) V
< Vars2: apply IH to IsE2.
Subgoal 1.2:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (plus E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
============================
exists V, vars (plus E1 E2) V
< IsV: apply vars_is to IsE1 Vars1.
Subgoal 1.2:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (plus E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
============================
exists V, vars (plus E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2.
Subgoal 1.2:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (plus E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
============================
exists V, vars (plus E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1.
Subgoal 1.2:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (plus E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
H1 : V ++ V1 = L
============================
exists V, vars (plus E1 E2) V
< search.
Subgoal 1.3:
Variables: S
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (name S) @
IsE1 : is_string S
============================
exists V, vars (name S) V
< search.
Subgoal 1.4:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (greater E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (greater E1 E2) V
< Vars1: apply IH to IsE1.
Subgoal 1.4:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (greater E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
============================
exists V, vars (greater E1 E2) V
< Vars2: apply IH to IsE2.
Subgoal 1.4:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (greater E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
============================
exists V, vars (greater E1 E2) V
< IsV: apply vars_is to IsE1 Vars1.
Subgoal 1.4:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (greater E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
============================
exists V, vars (greater E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2.
Subgoal 1.4:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (greater E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
============================
exists V, vars (greater E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1.
Subgoal 1.4:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (greater E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
H1 : V ++ V1 = L
============================
exists V, vars (greater E1 E2) V
< search.
Subgoal 1.5:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (eq E1 E2) V
< Vars1: apply IH to IsE1.
Subgoal 1.5:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
============================
exists V, vars (eq E1 E2) V
< Vars2: apply IH to IsE2.
Subgoal 1.5:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
============================
exists V, vars (eq E1 E2) V
< IsV: apply vars_is to IsE1 Vars1.
Subgoal 1.5:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
============================
exists V, vars (eq E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2.
Subgoal 1.5:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
============================
exists V, vars (eq E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1.
Subgoal 1.5:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (eq E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
H1 : V ++ V1 = L
============================
exists V, vars (eq E1 E2) V
< search.
Subgoal 1.6:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (and E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (and E1 E2) V
< Vars1: apply IH to IsE1.
Subgoal 1.6:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (and E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
============================
exists V, vars (and E1 E2) V
< Vars2: apply IH to IsE2.
Subgoal 1.6:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (and E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
============================
exists V, vars (and E1 E2) V
< IsV: apply vars_is to IsE1 Vars1.
Subgoal 1.6:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (and E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
============================
exists V, vars (and E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2.
Subgoal 1.6:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (and E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
============================
exists V, vars (and E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1.
Subgoal 1.6:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (and E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
H1 : V ++ V1 = L
============================
exists V, vars (and E1 E2) V
< search.
Subgoal 1.7:
Variables: E2 E1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (or E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
============================
exists V, vars (or E1 E2) V
< Vars1: apply IH to IsE1.
Subgoal 1.7:
Variables: E2 E1 V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (or E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
============================
exists V, vars (or E1 E2) V
< Vars2: apply IH to IsE2.
Subgoal 1.7:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (or E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
============================
exists V, vars (or E1 E2) V
< IsV: apply vars_is to IsE1 Vars1.
Subgoal 1.7:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (or E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
============================
exists V, vars (or E1 E2) V
< IsV1: apply vars_is to IsE2 Vars2.
Subgoal 1.7:
Variables: E2 E1 V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (or E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
============================
exists V, vars (or E1 E2) V
< apply append__is_list__is_string__total to IsV IsV1.
Subgoal 1.7:
Variables: E2 E1 V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (or E1 E2) @
IsE1 : is_e E1 *
IsE2 : is_e E2 *
Vars1 : vars E1 V
Vars2 : vars E2 V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
H1 : V ++ V1 = L
============================
exists V, vars (or E1 E2) V
< search.
Subgoal 1.8:
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e true @
============================
exists V, vars true V
< search.
Subgoal 1.9:
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e false @
============================
exists V, vars false V
< search.
Subgoal 1.10:
Variables: RecFieldExprs
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (recBuild RecFieldExprs) @
IsE1 : is_recFieldExprs RecFieldExprs *
============================
exists V, vars (recBuild RecFieldExprs) V
< apply IH1 to IsE1.
Subgoal 1.10:
Variables: RecFieldExprs V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (recBuild RecFieldExprs) @
IsE1 : is_recFieldExprs RecFieldExprs *
H1 : vars_rf RecFieldExprs V
============================
exists V, vars (recBuild RecFieldExprs) V
< search.
Subgoal 1.11:
Variables: S E1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (recFieldAccess E1 S) @
IsE1 : is_e E1 *
IsE2 : is_string S
============================
exists V, vars (recFieldAccess E1 S) V
< apply IH to IsE1.
Subgoal 1.11:
Variables: S E1 V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsE : is_e (recFieldAccess E1 S) @
IsE1 : is_e E1 *
IsE2 : is_string S
H1 : vars E1 V
============================
exists V, vars (recFieldAccess E1 S) V
< search.
Subgoal 2.1:
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs endRecFieldExprs @
============================
exists V, vars_rf endRecFieldExprs V
< search.
Subgoal 2.2:
Variables: RecFieldExprs E S
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs (addRecFieldExprs S E RecFieldExprs) @
IsRF1 : is_string S
IsRF2 : is_e E *
IsRF3 : is_recFieldExprs RecFieldExprs *
============================
exists V, vars_rf (addRecFieldExprs S E RecFieldExprs) V
< VarsE: apply IH to IsRF2.
Subgoal 2.2:
Variables: RecFieldExprs E S V
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs (addRecFieldExprs S E RecFieldExprs) @
IsRF1 : is_string S
IsRF2 : is_e E *
IsRF3 : is_recFieldExprs RecFieldExprs *
VarsE : vars E V
============================
exists V, vars_rf (addRecFieldExprs S E RecFieldExprs) V
< VarsRest: apply IH1 to IsRF3.
Subgoal 2.2:
Variables: RecFieldExprs E S V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs (addRecFieldExprs S E RecFieldExprs) @
IsRF1 : is_string S
IsRF2 : is_e E *
IsRF3 : is_recFieldExprs RecFieldExprs *
VarsE : vars E V
VarsRest : vars_rf RecFieldExprs V1
============================
exists V, vars_rf (addRecFieldExprs S E RecFieldExprs) V
< IsV: apply vars_is to IsRF2 VarsE.
Subgoal 2.2:
Variables: RecFieldExprs E S V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs (addRecFieldExprs S E RecFieldExprs) @
IsRF1 : is_string S
IsRF2 : is_e E *
IsRF3 : is_recFieldExprs RecFieldExprs *
VarsE : vars E V
VarsRest : vars_rf RecFieldExprs V1
IsV : is_list is_string V
============================
exists V, vars_rf (addRecFieldExprs S E RecFieldExprs) V
< IsV1: apply vars_rf_is to IsRF3 VarsRest.
Subgoal 2.2:
Variables: RecFieldExprs E S V V1
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs (addRecFieldExprs S E RecFieldExprs) @
IsRF1 : is_string S
IsRF2 : is_e E *
IsRF3 : is_recFieldExprs RecFieldExprs *
VarsE : vars E V
VarsRest : vars_rf RecFieldExprs V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
============================
exists V, vars_rf (addRecFieldExprs S E RecFieldExprs) V
< apply append__is_list__is_string__total to IsV IsV1.
Subgoal 2.2:
Variables: RecFieldExprs E S V V1 L
IH : forall E, is_e E * -> exists V, vars E V
IH1 : forall RF, is_recFieldExprs RF * -> exists V, vars_rf RF V
IsRF : is_recFieldExprs (addRecFieldExprs S E RecFieldExprs) @
IsRF1 : is_string S
IsRF2 : is_e E *
IsRF3 : is_recFieldExprs RecFieldExprs *
VarsE : vars E V
VarsRest : vars_rf RecFieldExprs V1
IsV : is_list is_string V
IsV1 : is_list is_string V1
H1 : V ++ V1 = L
============================
exists V, vars_rf (addRecFieldExprs S E RecFieldExprs) V
< search.
Proof completed.
< Extensible_Theorem
typeOf_unique : forall G E T1 T2,
Ty1 : typeOf G E T1 ->
Ty2 : typeOf G E T2 ->
T1 = T2
on Ty1,
typeRecFields_unique : forall G RF T1 T2,
Ty1 : typeRecFields G RF T1 ->
Ty2 : typeRecFields G RF T2 ->
T1 = T2
on Ty1.
Subgoal 1.1:
Variables: G T2 I
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (num I) intTy @
Ty2 : typeOf G (num I) T2
============================
intTy = T2
< case Ty2.
Subgoal 1.1:
Variables: G I
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (num I) intTy @
============================
intTy = intTy
< search.
Subgoal 1.2:
Variables: G T2 E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (plus E1 E2) intTy @
Ty2 : typeOf G (plus E1 E2) T2
Ty3 : typeOf G E1 intTy *
Ty4 : typeOf G E2 intTy *
============================
intTy = T2
< Ty2: case Ty2.
Subgoal 1.2:
Variables: G E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (plus E1 E2) intTy @
Ty3 : typeOf G E1 intTy *
Ty4 : typeOf G E2 intTy *
Ty2 : typeOf G E1 intTy
Ty5 : typeOf G E2 intTy
============================
intTy = intTy
< search.
Subgoal 1.3:
Variables: G T1 T2 X
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (name X) T1 @
Ty2 : typeOf G (name X) T2
Ty3 : lookup G X T1
============================
T1 = T2
< Ty2: case Ty2.
Subgoal 1.3:
Variables: G T1 T2 X
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (name X) T1 @
Ty3 : lookup G X T1
Ty2 : lookup G X T2
============================
T1 = T2
< apply lookup_unique to Ty3 Ty2.
Subgoal 1.3:
Variables: G T2 X
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (name X) T2 @
Ty3 : lookup G X T2
Ty2 : lookup G X T2
============================
T2 = T2
< search.
Subgoal 1.4:
Variables: G T2 E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (greater E1 E2) boolTy @
Ty2 : typeOf G (greater E1 E2) T2
Ty3 : typeOf G E1 intTy *
Ty4 : typeOf G E2 intTy *
============================
boolTy = T2
< Ty2: case Ty2.
Subgoal 1.4:
Variables: G E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (greater E1 E2) boolTy @
Ty3 : typeOf G E1 intTy *
Ty4 : typeOf G E2 intTy *
Ty2 : typeOf G E1 intTy
Ty5 : typeOf G E2 intTy
============================
boolTy = boolTy
< search.
Subgoal 1.5:
Variables: G T2 Ty E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (eq E1 E2) boolTy @
Ty2 : typeOf G (eq E1 E2) T2
Ty3 : typeOf G E1 Ty *
Ty4 : typeOf G E2 Ty *
============================
boolTy = T2
< Ty2: case Ty2.
Subgoal 1.5:
Variables: G Ty E2 E1 Ty1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (eq E1 E2) boolTy @
Ty3 : typeOf G E1 Ty *
Ty4 : typeOf G E2 Ty *
Ty2 : typeOf G E1 Ty1
Ty5 : typeOf G E2 Ty1
============================
boolTy = boolTy
< apply IH to Ty3 Ty2.
Subgoal 1.5:
Variables: G E2 E1 Ty1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (eq E1 E2) boolTy @
Ty3 : typeOf G E1 Ty1 *
Ty4 : typeOf G E2 Ty1 *
Ty2 : typeOf G E1 Ty1
Ty5 : typeOf G E2 Ty1
============================
boolTy = boolTy
< search.
Subgoal 1.6:
Variables: G T2 E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (and E1 E2) boolTy @
Ty2 : typeOf G (and E1 E2) T2
Ty3 : typeOf G E1 boolTy *
Ty4 : typeOf G E2 boolTy *
============================
boolTy = T2
< case Ty2.
Subgoal 1.6:
Variables: G E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (and E1 E2) boolTy @
Ty3 : typeOf G E1 boolTy *
Ty4 : typeOf G E2 boolTy *
H1 : typeOf G E1 boolTy
H2 : typeOf G E2 boolTy
============================
boolTy = boolTy
< search.
Subgoal 1.7:
Variables: G T2 E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (or E1 E2) boolTy @
Ty2 : typeOf G (or E1 E2) T2
Ty3 : typeOf G E1 boolTy *
Ty4 : typeOf G E2 boolTy *
============================
boolTy = T2
< case Ty2.
Subgoal 1.7:
Variables: G E2 E1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (or E1 E2) boolTy @
Ty3 : typeOf G E1 boolTy *
Ty4 : typeOf G E2 boolTy *
H1 : typeOf G E1 boolTy
H2 : typeOf G E2 boolTy
============================
boolTy = boolTy
< search.
Subgoal 1.8:
Variables: G T2
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G true boolTy @
Ty2 : typeOf G true T2
============================
boolTy = T2
< case Ty2.
Subgoal 1.8:
Variables: G
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G true boolTy @
============================
boolTy = boolTy
< search.
Subgoal 1.9:
Variables: G T2
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G false boolTy @
Ty2 : typeOf G false T2
============================
boolTy = T2
< case Ty2.
Subgoal 1.9:
Variables: G
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G false boolTy @
============================
boolTy = boolTy
< search.
Subgoal 1.10:
Variables: G T2 FTys Fields
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recBuild Fields) (recTy FTys) @
Ty2 : typeOf G (recBuild Fields) T2
Ty3 : typeRecFields G Fields FTys *
============================
recTy FTys = T2
< Ty2: case Ty2.
Subgoal 1.10:
Variables: G FTys Fields FTys1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recBuild Fields) (recTy FTys) @
Ty3 : typeRecFields G Fields FTys *
Ty2 : typeRecFields G Fields FTys1
============================
recTy FTys = recTy FTys1
< apply IH1 to Ty3 Ty2.
Subgoal 1.10:
Variables: G Fields FTys1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recBuild Fields) (recTy FTys1) @
Ty3 : typeRecFields G Fields FTys1 *
Ty2 : typeRecFields G Fields FTys1
============================
recTy FTys1 = recTy FTys1
< search.
Subgoal 1.11:
Variables: G T1 T2 Fields Field Rec
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recFieldAccess Rec Field) T1 @
Ty2 : typeOf G (recFieldAccess Rec Field) T2
Ty3 : typeOf G Rec (recTy Fields) *
Ty4 : lookup Fields Field T1
============================
T1 = T2
< Ty2: case Ty2.
Subgoal 1.11:
Variables: G T1 T2 Fields Field Rec Fields1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recFieldAccess Rec Field) T1 @
Ty3 : typeOf G Rec (recTy Fields) *
Ty4 : lookup Fields Field T1
Ty2 : typeOf G Rec (recTy Fields1)
Ty5 : lookup Fields1 Field T2
============================
T1 = T2
< apply IH to Ty3 Ty2.
Subgoal 1.11:
Variables: G T1 T2 Field Rec Fields1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recFieldAccess Rec Field) T1 @
Ty3 : typeOf G Rec (recTy Fields1) *
Ty4 : lookup Fields1 Field T1
Ty2 : typeOf G Rec (recTy Fields1)
Ty5 : lookup Fields1 Field T2
============================
T1 = T2
< apply lookup_unique to Ty4 Ty5.
Subgoal 1.11:
Variables: G T2 Field Rec Fields1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeOf G (recFieldAccess Rec Field) T2 @
Ty3 : typeOf G Rec (recTy Fields1) *
Ty4 : lookup Fields1 Field T2
Ty2 : typeOf G Rec (recTy Fields1)
Ty5 : lookup Fields1 Field T2
============================
T2 = T2
< search.
Subgoal 2.1:
Variables: G T2
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeRecFields G endRecFieldExprs [] @
Ty2 : typeRecFields G endRecFieldExprs T2
============================
[] = T2
< case Ty2.
Subgoal 2.1:
Variables: G
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeRecFields G endRecFieldExprs [] @
============================
[] = []
< search.
Subgoal 2.2:
Variables: G T2 FTys Ty L Rest E
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeRecFields G (addRecFieldExprs L E Rest) ((L, Ty)::FTys) @
Ty2 : typeRecFields G (addRecFieldExprs L E Rest) T2
Ty3 : typeOf G E Ty *
Ty4 : typeRecFields G Rest FTys *
Ty5 : no_lookup FTys L
============================
(L, Ty)::FTys = T2
< Ty2: case Ty2.
Subgoal 2.2:
Variables: G FTys Ty L Rest E FTys1 Ty1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeRecFields G (addRecFieldExprs L E Rest) ((L, Ty)::FTys) @
Ty3 : typeOf G E Ty *
Ty4 : typeRecFields G Rest FTys *
Ty5 : no_lookup FTys L
Ty2 : typeOf G E Ty1
Ty6 : typeRecFields G Rest FTys1
Ty7 : no_lookup FTys1 L
============================
(L, Ty)::FTys = (L, Ty1)::FTys1
< apply IH to Ty3 Ty2.
Subgoal 2.2:
Variables: G FTys L Rest E FTys1 Ty1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeRecFields G (addRecFieldExprs L E Rest) ((L, Ty1)::FTys) @
Ty3 : typeOf G E Ty1 *
Ty4 : typeRecFields G Rest FTys *
Ty5 : no_lookup FTys L
Ty2 : typeOf G E Ty1
Ty6 : typeRecFields G Rest FTys1
Ty7 : no_lookup FTys1 L
============================
(L, Ty1)::FTys = (L, Ty1)::FTys1
< apply IH1 to Ty4 Ty6.
Subgoal 2.2:
Variables: G L Rest E FTys1 Ty1
IH : forall G E T1 T2, typeOf G E T1 * -> typeOf G E T2 -> T1 = T2
IH1 : forall G RF T1 T2,
typeRecFields G RF T1 * -> typeRecFields G RF T2 -> T1 = T2
Ty1 : typeRecFields G (addRecFieldExprs L E Rest) ((L, Ty1)::FTys1) @
Ty3 : typeOf G E Ty1 *
Ty4 : typeRecFields G Rest FTys1 *
Ty5 : no_lookup FTys1 L
Ty2 : typeOf G E Ty1
Ty6 : typeRecFields G Rest FTys1
Ty7 : no_lookup FTys1 L
============================
(L, Ty1)::FTys1 = (L, Ty1)::FTys1
< search.
Proof completed.
< Extensible_Theorem
typeOK_unique : forall G C G1 G2,
Ty1 : typeOK G C G1 ->
Ty2 : typeOK G C G2 ->
G1 = G2
on Ty1.
Subgoal 1:
Variables: G1 G2
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G1 noop G1 @
Ty2 : typeOK G1 noop G2
============================
G1 = G2
< case Ty2.
Subgoal 1:
Variables: G2
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 noop G2 @
============================
G2 = G2
< search.
Subgoal 2:
Variables: G G1 G2 G3 C2 C1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (seq C1 C2) G1 @
Ty2 : typeOK G (seq C1 C2) G2
Ty3 : typeOK G C1 G3 *
Ty4 : typeOK G3 C2 G1 *
============================
G1 = G2
< Ty2: case Ty2.
Subgoal 2:
Variables: G G1 G2 G3 C2 C1 G4
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (seq C1 C2) G1 @
Ty3 : typeOK G C1 G3 *
Ty4 : typeOK G3 C2 G1 *
Ty2 : typeOK G C1 G4
Ty5 : typeOK G4 C2 G2
============================
G1 = G2
< apply IH to Ty3 Ty2.
Subgoal 2:
Variables: G G1 G2 C2 C1 G4
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (seq C1 C2) G1 @
Ty3 : typeOK G C1 G4 *
Ty4 : typeOK G4 C2 G1 *
Ty2 : typeOK G C1 G4
Ty5 : typeOK G4 C2 G2
============================
G1 = G2
< apply IH to Ty4 Ty5.
Subgoal 2:
Variables: G G2 C2 C1 G4
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (seq C1 C2) G2 @
Ty3 : typeOK G C1 G4 *
Ty4 : typeOK G4 C2 G2 *
Ty2 : typeOK G C1 G4
Ty5 : typeOK G4 C2 G2
============================
G2 = G2
< search.
Subgoal 3:
Variables: G G2 Ty X E
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (declare X Ty E) ((X, Ty)::G) @
Ty2 : typeOK G (declare X Ty E) G2
Ty3 : no_lookup G X
Ty4 : typeOf G E Ty
============================
(X, Ty)::G = G2
< Ty2: case Ty2.
Subgoal 3:
Variables: G Ty X E
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (declare X Ty E) ((X, Ty)::G) @
Ty3 : no_lookup G X
Ty4 : typeOf G E Ty
Ty2 : no_lookup G X
Ty5 : typeOf G E Ty
============================
(X, Ty)::G = (X, Ty)::G
< apply typeOf_unique to Ty4 Ty5.
Subgoal 3:
Variables: G Ty X E
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G (declare X Ty E) ((X, Ty)::G) @
Ty3 : no_lookup G X
Ty4 : typeOf G E Ty
Ty2 : no_lookup G X
Ty5 : typeOf G E Ty
============================
(X, Ty)::G = (X, Ty)::G
< search.
Subgoal 4:
Variables: G1 G2 Ty E X
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G1 (assign X E) G1 @
Ty2 : typeOK G1 (assign X E) G2
Ty3 : typeOf G1 E Ty
Ty4 : lookup G1 X Ty
============================
G1 = G2
< Ty2: case Ty2.
Subgoal 4:
Variables: G2 Ty E X Ty1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (assign X E) G2 @
Ty3 : typeOf G2 E Ty
Ty4 : lookup G2 X Ty
Ty2 : typeOf G2 E Ty1
Ty5 : lookup G2 X Ty1
============================
G2 = G2
< apply typeOf_unique to Ty3 Ty2.
Subgoal 4:
Variables: G2 E X Ty1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (assign X E) G2 @
Ty3 : typeOf G2 E Ty1
Ty4 : lookup G2 X Ty1
Ty2 : typeOf G2 E Ty1
Ty5 : lookup G2 X Ty1
============================
G2 = G2
< search.
Subgoal 5:
Variables: G1 G2 GT GE Else Then Cond
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G1 (ifThenElse Cond Then Else) G1 @
Ty2 : typeOK G1 (ifThenElse Cond Then Else) G2
Ty3 : typeOf G1 Cond boolTy
Ty4 : typeOK G1 Then GT *
Ty5 : typeOK G1 Else GE *
============================
G1 = G2
< Ty2: case Ty2.
Subgoal 5:
Variables: G2 GT GE Else Then Cond GT1 GE1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (ifThenElse Cond Then Else) G2 @
Ty3 : typeOf G2 Cond boolTy
Ty4 : typeOK G2 Then GT *
Ty5 : typeOK G2 Else GE *
Ty2 : typeOf G2 Cond boolTy
Ty6 : typeOK G2 Then GT1
Ty7 : typeOK G2 Else GE1
============================
G2 = G2
< search.
Subgoal 6:
Variables: G1 G2 GB Body Cond
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G1 (while Cond Body) G1 @
Ty2 : typeOK G1 (while Cond Body) G2
Ty3 : typeOf G1 Cond boolTy
Ty4 : typeOK G1 Body GB *
============================
G1 = G2
< Ty2: case Ty2.
Subgoal 6:
Variables: G2 GB Body Cond GB1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (while Cond Body) G2 @
Ty3 : typeOf G2 Cond boolTy
Ty4 : typeOK G2 Body GB *
Ty2 : typeOf G2 Cond boolTy
Ty5 : typeOK G2 Body GB1
============================
G2 = G2
< apply IH to Ty4 Ty5.
Subgoal 6:
Variables: G2 Body Cond GB1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (while Cond Body) G2 @
Ty3 : typeOf G2 Cond boolTy
Ty4 : typeOK G2 Body GB1 *
Ty2 : typeOf G2 Cond boolTy
Ty5 : typeOK G2 Body GB1
============================
G2 = G2
< search.
Subgoal 7:
Variables: G1 G2 FFields Ty E Fields Rec
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G1 (recUpdate Rec Fields E) G1 @
Ty2 : typeOK G1 (recUpdate Rec Fields E) G2
Ty3 : lookup G1 Rec (recTy FFields)
Ty4 : checkRecUpdate Fields FFields Ty
Ty5 : typeOf G1 E Ty
============================
G1 = G2
< Ty2: case Ty2.
Subgoal 7:
Variables: G2 FFields Ty E Fields Rec FFields1 Ty1
IH : forall G C G1 G2, typeOK G C G1 * -> typeOK G C G2 -> G1 = G2
Ty1 : typeOK G2 (recUpdate Rec Fields E) G2 @
Ty3 : lookup G2 Rec (recTy FFields)
Ty4 : checkRecUpdate Fields FFields Ty
Ty5 : typeOf G2 E Ty
Ty2 : lookup G2 Rec (recTy FFields1)
Ty6 : checkRecUpdate Fields FFields1 Ty1
Ty7 : typeOf G2 E Ty1
============================
G2 = G2
< search.
Proof completed.
< Projection_Constraint proj_eval_e :
forall G E E' V,
|{e}- E ~~> E' -> eval_e G E V -> 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,
eval_rf_unique : forall G RF V1 V2,
Ev1 : eval_rf G RF V1 ->
Ev2 : eval_rf G RF V2 ->
V1 = V2
on Ev1.
Subgoal 1.1:
Variables: G V2 I
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (num I) (intVal I) @
Ev2 : eval_e G (num I) V2
============================
intVal I = V2
< case Ev2.
Subgoal 1.1:
Variables: G I
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (num I) (intVal I) @
============================
intVal I = intVal I
< search.
Subgoal 1.2:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (plus E1 E2) (intVal I) @
Ev2 : eval_e G (plus E1 E2) V2
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 + I2 = I
============================
intVal I = V2
< Ev2: case Ev2.
Subgoal 1.2:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (plus E1 E2) (intVal I) @
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G E1 (intVal I4)
Ev6 : eval_e G E2 (intVal I5)
Ev7 : I4 + I5 = I3
============================
intVal I = intVal I3
< apply IH to Ev3 Ev2.
Subgoal 1.2:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (plus E1 E2) (intVal I) @
Ev3 : eval_e G E1 (intVal I4) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I4 + I2 = I
Ev2 : eval_e G E1 (intVal I4)
Ev6 : eval_e G E2 (intVal I5)
Ev7 : I4 + I5 = I3
============================
intVal I = intVal I3
< apply IH to Ev4 Ev6.
Subgoal 1.2:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (plus E1 E2) (intVal I) @
Ev3 : eval_e G E1 (intVal I4) *
Ev4 : eval_e G E2 (intVal I5) *
Ev5 : I4 + I5 = I
Ev2 : eval_e G E1 (intVal I4)
Ev6 : eval_e G E2 (intVal I5)
Ev7 : I4 + I5 = I3
============================
intVal I = intVal I3
< apply plus_integer_unique to Ev5 Ev7.
Subgoal 1.2:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (plus E1 E2) (intVal I3) @
Ev3 : eval_e G E1 (intVal I4) *
Ev4 : eval_e G E2 (intVal I5) *
Ev5 : I4 + I5 = I3
Ev2 : eval_e G E1 (intVal I4)
Ev6 : eval_e G E2 (intVal I5)
Ev7 : I4 + I5 = I3
============================
intVal I3 = intVal I3
< search.
Subgoal 1.3:
Variables: G V1 V2 X
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (name X) V1 @
Ev2 : eval_e G (name X) V2
Ev3 : lookup G X V1
============================
V1 = V2
< Ev2: case Ev2.
Subgoal 1.3:
Variables: G V1 V2 X
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (name X) V1 @
Ev3 : lookup G X V1
Ev2 : lookup G X V2
============================
V1 = V2
< apply lookup_unique to Ev3 Ev2.
Subgoal 1.3:
Variables: G V2 X
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (name X) V2 @
Ev3 : lookup G X V2
Ev2 : lookup G X V2
============================
V2 = V2
< search.
Subgoal 1.4:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) trueVal @
Ev2 : eval_e G (greater E1 E2) V2
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 > I2
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.4.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) trueVal @
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 > I2
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 > I4
============================
trueVal = trueVal
< search.
Subgoal 1.4.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) trueVal @
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 > I2
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 <= I4
============================
trueVal = falseVal
< apply IH to Ev3 Ev2.
Subgoal 1.4.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) trueVal @
Ev3 : eval_e G E1 (intVal I3) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I3 > I2
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 <= I4
============================
trueVal = falseVal
< apply IH to Ev4 Ev6.
Subgoal 1.4.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) trueVal @
Ev3 : eval_e G E1 (intVal I3) *
Ev4 : eval_e G E2 (intVal I4) *
Ev5 : I3 > I4
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 <= I4
============================
trueVal = falseVal
< apply greater_lesseq_integer_false to Ev5 Ev7.
Subgoal 1.5:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) falseVal @
Ev2 : eval_e G (greater E1 E2) V2
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 <= I2
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.5.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) falseVal @
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 > I4
============================
falseVal = trueVal
< apply IH to Ev3 Ev2.
Subgoal 1.5.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) falseVal @
Ev3 : eval_e G E1 (intVal I3) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I3 <= I2
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 > I4
============================
falseVal = trueVal
< apply IH to Ev4 Ev6.
Subgoal 1.5.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) falseVal @
Ev3 : eval_e G E1 (intVal I3) *
Ev4 : eval_e G E2 (intVal I4) *
Ev5 : I3 <= I4
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 > I4
============================
falseVal = trueVal
< apply greater_lesseq_integer_false to Ev7 Ev5.
Subgoal 1.5.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (greater E1 E2) falseVal @
Ev3 : eval_e G E1 (intVal I1) *
Ev4 : eval_e G E2 (intVal I2) *
Ev5 : I1 <= I2
Ev2 : eval_e G E1 (intVal I3)
Ev6 : eval_e G E2 (intVal I4)
Ev7 : I3 <= I4
============================
falseVal = falseVal
< search.
Subgoal 1.6:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueVal @
Ev2 : eval_e G (eq E1 E2) V2
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V3 V4
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.6.1:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueVal @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V3 V4
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6
============================
trueVal = trueVal
< search.
Subgoal 1.6.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueVal @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V3 V4
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6 -> false
============================
trueVal = falseVal
< apply IH to Ev3 Ev2.
Subgoal 1.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueVal @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V5 V4
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6 -> false
============================
trueVal = falseVal
< apply IH to Ev4 Ev6.
Subgoal 1.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) trueVal @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V6 *
Ev5 : val_eq V5 V6
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6 -> false
============================
trueVal = falseVal
< apply Ev7 to Ev5.
Subgoal 1.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseVal @
Ev2 : eval_e G (eq E1 E2) V2
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V3 V4 -> false
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.7.1:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseVal @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V3 V4 -> false
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6
============================
falseVal = trueVal
< apply IH to Ev3 Ev2.
Subgoal 1.7.1:
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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseVal @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V5 V4 -> false
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6
============================
falseVal = trueVal
< apply IH to Ev4 Ev6.
Subgoal 1.7.1:
Variables: G E2 E1 V5 V6
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseVal @
Ev3 : eval_e G E1 V5 *
Ev4 : eval_e G E2 V6 *
Ev5 : val_eq V5 V6 -> false
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6
============================
falseVal = trueVal
< apply Ev5 to Ev7.
Subgoal 1.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
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (eq E1 E2) falseVal @
Ev3 : eval_e G E1 V3 *
Ev4 : eval_e G E2 V4 *
Ev5 : val_eq V3 V4 -> false
Ev2 : eval_e G E1 V5
Ev6 : eval_e G E2 V6
Ev7 : val_eq V5 V6 -> false
============================
falseVal = falseVal
< search.
Subgoal 1.8:
Variables: G V2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) trueVal @
Ev2 : eval_e G (and E1 E2) V2
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 trueVal *
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.8.1:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) trueVal @
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 trueVal *
Ev2 : eval_e G E1 trueVal
Ev5 : eval_e G E2 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.8.2:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) trueVal @
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 trueVal *
Ev2 : eval_e G E1 falseVal
============================
trueVal = falseVal
< apply IH to Ev3 Ev2.
Subgoal 1.8.3:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) trueVal @
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 trueVal *
Ev2 : eval_e G E1 trueVal
Ev5 : eval_e G E2 falseVal
============================
trueVal = falseVal
< apply IH to Ev4 Ev5.
Subgoal 1.9:
Variables: G V2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev2 : eval_e G (and E1 E2) V2
Ev3 : eval_e G E1 falseVal *
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.9.1:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev3 : eval_e G E1 falseVal *
Ev2 : eval_e G E1 trueVal
Ev4 : eval_e G E2 trueVal
============================
falseVal = trueVal
< apply IH to Ev3 Ev2.
Subgoal 1.9.2:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev3 : eval_e G E1 falseVal *
Ev2 : eval_e G E1 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.9.3:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev3 : eval_e G E1 falseVal *
Ev2 : eval_e G E1 trueVal
Ev4 : eval_e G E2 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.10:
Variables: G V2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev2 : eval_e G (and E1 E2) V2
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 falseVal *
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.10.1:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 falseVal *
Ev2 : eval_e G E1 trueVal
Ev5 : eval_e G E2 trueVal
============================
falseVal = trueVal
< apply IH to Ev4 Ev5.
Subgoal 1.10.2:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 falseVal *
Ev2 : eval_e G E1 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.10.3:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (and E1 E2) falseVal @
Ev3 : eval_e G E1 trueVal *
Ev4 : eval_e G E2 falseVal *
Ev2 : eval_e G E1 trueVal
Ev5 : eval_e G E2 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.11:
Variables: G V2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev2 : eval_e G (or E1 E2) V2
Ev3 : eval_e G E1 trueVal *
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.11.1:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev3 : eval_e G E1 trueVal *
Ev2 : eval_e G E1 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.11.2:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev3 : eval_e G E1 trueVal *
Ev2 : eval_e G E1 falseVal
Ev4 : eval_e G E2 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.11.3:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev3 : eval_e G E1 trueVal *
Ev2 : eval_e G E1 falseVal
Ev4 : eval_e G E2 falseVal
============================
trueVal = falseVal
< apply IH to Ev3 Ev2.
Subgoal 1.12:
Variables: G V2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev2 : eval_e G (or E1 E2) V2
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 trueVal *
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.12.1:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 trueVal *
Ev2 : eval_e G E1 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.12.2:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 trueVal *
Ev2 : eval_e G E1 falseVal
Ev5 : eval_e G E2 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.12.3:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) trueVal @
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 trueVal *
Ev2 : eval_e G E1 falseVal
Ev5 : eval_e G E2 falseVal
============================
trueVal = falseVal
< apply IH to Ev4 Ev5.
Subgoal 1.13:
Variables: G V2 E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) falseVal @
Ev2 : eval_e G (or E1 E2) V2
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 falseVal *
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.13.1:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) falseVal @
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 falseVal *
Ev2 : eval_e G E1 trueVal
============================
falseVal = trueVal
< apply IH to Ev3 Ev2.
Subgoal 1.13.2:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) falseVal @
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 falseVal *
Ev2 : eval_e G E1 falseVal
Ev5 : eval_e G E2 trueVal
============================
falseVal = trueVal
< apply IH to Ev4 Ev5.
Subgoal 1.13.3:
Variables: G E2 E1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (or E1 E2) falseVal @
Ev3 : eval_e G E1 falseVal *
Ev4 : eval_e G E2 falseVal *
Ev2 : eval_e G E1 falseVal
Ev5 : eval_e G E2 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.14:
Variables: G V2
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G true trueVal @
Ev2 : eval_e G true V2
============================
trueVal = V2
< case Ev2.
Subgoal 1.14:
Variables: G
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G true trueVal @
============================
trueVal = trueVal
< search.
Subgoal 1.15:
Variables: G V2
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G false falseVal @
Ev2 : eval_e G false V2
============================
falseVal = V2
< case Ev2.
Subgoal 1.15:
Variables: G
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G false falseVal @
============================
falseVal = falseVal
< search.
Subgoal 1.16:
Variables: G V2 FieldVals Fields
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recBuild Fields) (recVal FieldVals) @
Ev2 : eval_e G (recBuild Fields) V2
Ev3 : eval_rf G Fields FieldVals *
============================
recVal FieldVals = V2
< Ev2: case Ev2.
Subgoal 1.16:
Variables: G FieldVals Fields FieldVals1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recBuild Fields) (recVal FieldVals) @
Ev3 : eval_rf G Fields FieldVals *
Ev2 : eval_rf G Fields FieldVals1
============================
recVal FieldVals = recVal FieldVals1
< apply IH1 to Ev3 Ev2.
Subgoal 1.16:
Variables: G Fields FieldVals1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recBuild Fields) (recVal FieldVals1) @
Ev3 : eval_rf G Fields FieldVals1 *
Ev2 : eval_rf G Fields FieldVals1
============================
recVal FieldVals1 = recVal FieldVals1
< search.
Subgoal 1.17:
Variables: G V1 V2 Fields Field Rec
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recFieldAccess Rec Field) V1 @
Ev2 : eval_e G (recFieldAccess Rec Field) V2
Ev3 : eval_e G Rec (recVal Fields) *
Ev4 : lookup Fields Field V1
============================
V1 = V2
< Ev2: case Ev2.
Subgoal 1.17:
Variables: G V1 V2 Fields Field Rec Fields1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recFieldAccess Rec Field) V1 @
Ev3 : eval_e G Rec (recVal Fields) *
Ev4 : lookup Fields Field V1
Ev2 : eval_e G Rec (recVal Fields1)
Ev5 : lookup Fields1 Field V2
============================
V1 = V2
< apply IH to Ev3 Ev2.
Subgoal 1.17:
Variables: G V1 V2 Field Rec Fields1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recFieldAccess Rec Field) V1 @
Ev3 : eval_e G Rec (recVal Fields1) *
Ev4 : lookup Fields1 Field V1
Ev2 : eval_e G Rec (recVal Fields1)
Ev5 : lookup Fields1 Field V2
============================
V1 = V2
< apply lookup_unique to Ev4 Ev5.
Subgoal 1.17:
Variables: G V2 Field Rec Fields1
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_e G (recFieldAccess Rec Field) V2 @
Ev3 : eval_e G Rec (recVal Fields1) *
Ev4 : lookup Fields1 Field V2
Ev2 : eval_e G Rec (recVal Fields1)
Ev5 : lookup Fields1 Field V2
============================
V2 = V2
< search.
Subgoal 2.1:
Variables: G V2
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_rf G endRecFieldExprs [] @
Ev2 : eval_rf G endRecFieldExprs V2
============================
[] = V2
< case Ev2.
Subgoal 2.1:
Variables: G
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_rf G endRecFieldExprs [] @
============================
[] = []
< search.
Subgoal 2.2:
Variables: G V2 FVs V L Rest E
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_rf G (addRecFieldExprs L E Rest) ((L, V)::FVs) @
Ev2 : eval_rf G (addRecFieldExprs L E Rest) V2
Ev3 : eval_e G E V *
Ev4 : eval_rf G Rest FVs *
============================
(L, V)::FVs = V2
< Ev2: case Ev2.
Subgoal 2.2:
Variables: G FVs V L Rest E FVs1 V3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_rf G (addRecFieldExprs L E Rest) ((L, V)::FVs) @
Ev3 : eval_e G E V *
Ev4 : eval_rf G Rest FVs *
Ev2 : eval_e G E V3
Ev5 : eval_rf G Rest FVs1
============================
(L, V)::FVs = (L, V3)::FVs1
< apply IH to Ev3 Ev2.
Subgoal 2.2:
Variables: G FVs L Rest E FVs1 V3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_rf G (addRecFieldExprs L E Rest) ((L, V3)::FVs) @
Ev3 : eval_e G E V3 *
Ev4 : eval_rf G Rest FVs *
Ev2 : eval_e G E V3
Ev5 : eval_rf G Rest FVs1
============================
(L, V3)::FVs = (L, V3)::FVs1
< apply IH1 to Ev4 Ev5.
Subgoal 2.2:
Variables: G L Rest E FVs1 V3
IH : forall G E V1 V2, eval_e G E V1 * -> eval_e G E V2 -> V1 = V2
IH1 : forall G RF V1 V2, eval_rf G RF V1 * -> eval_rf G RF V2 -> V1 = V2
Ev1 : eval_rf G (addRecFieldExprs L E Rest) ((L, V3)::FVs1) @
Ev3 : eval_e G E V3 *
Ev4 : eval_rf G Rest FVs1 *
Ev2 : eval_e G E V3
Ev5 : eval_rf G Rest FVs1
============================
(L, V3)::FVs1 = (L, V3)::FVs1
< search.
Proof completed.
< Extensible_Theorem
update_rec_fields_unique : forall F G V G1 G2,
U1 : update_rec_fields F G V G1 ->
U2 : update_rec_fields F G V G2 ->
G1 = G2
on U1.
Subgoal 1:
Variables: G V G2 F1
IH : forall F G V G1 G2,
update_rec_fields F G V G1 * -> update_rec_fields F G V G2 -> G1 = G2
U1 : update_rec_fields (oneField F1) G V ((F1, V)::G) @
U2 : update_rec_fields (oneField F1) G V G2
============================
(F1, V)::G = G2
< case U2.
Subgoal 1:
Variables: G V F1
IH : forall F G V G1 G2,
update_rec_fields F G V G1 * -> update_rec_fields F G V G2 -> G1 = G2
U1 : update_rec_fields (oneField F1) G V ((F1, V)::G) @
============================
(F1, V)::G = (F1, V)::G
< search.
Subgoal 2:
Variables: G V G2 FFields UpdatedFFields F1 Rest
IH : forall F G V G1 G2,
update_rec_fields F G V G1 * -> update_rec_fields F G V G2 -> G1 = G2
U1 : update_rec_fields (addField F1 Rest) G V ((F1, recVal UpdatedFFields)::G) @
U2 : update_rec_fields (addField F1 Rest) G V G2
U3 : lookup G F1 (recVal FFields)
U4 : update_rec_fields Rest FFields V UpdatedFFields *
============================
(F1, recVal UpdatedFFields)::G = G2
< U2: case U2.
Subgoal 2:
Variables: G V FFields UpdatedFFields F1 Rest FFields1 UpdatedFFields1
IH : forall F G V G1 G2,
update_rec_fields F G V G1 * -> update_rec_fields F G V G2 -> G1 = G2
U1 : update_rec_fields (addField F1 Rest) G V ((F1, recVal UpdatedFFields)::G) @
U3 : lookup G F1 (recVal FFields)
U4 : update_rec_fields Rest FFields V UpdatedFFields *
U2 : lookup G F1 (recVal FFields1)
U5 : update_rec_fields Rest FFields1 V UpdatedFFields1
============================
(F1, recVal UpdatedFFields)::G = (F1, recVal UpdatedFFields1)::G
< apply lookup_unique to U3 U2.
Subgoal 2:
Variables: G V UpdatedFFields F1 Rest FFields1 UpdatedFFields1
IH : forall F G V G1 G2,
update_rec_fields F G V G1 * -> update_rec_fields F G V G2 -> G1 = G2
U1 : update_rec_fields (addField F1 Rest) G V ((F1, recVal UpdatedFFields)::G) @
U3 : lookup G F1 (recVal FFields1)
U4 : update_rec_fields Rest FFields1 V UpdatedFFields *
U2 : lookup G F1 (recVal FFields1)
U5 : update_rec_fields Rest FFields1 V UpdatedFFields1
============================
(F1, recVal UpdatedFFields)::G = (F1, recVal UpdatedFFields1)::G
< apply IH to U4 U5.
Subgoal 2:
Variables: G V F1 Rest FFields1 UpdatedFFields1
IH : forall F G V G1 G2,
update_rec_fields F G V G1 * -> update_rec_fields F G V G2 -> G1 = G2
U1 : update_rec_fields (addField F1 Rest) G V ((F1, recVal UpdatedFFields1)::G) @
U3 : lookup G F1 (recVal FFields1)
U4 : update_rec_fields Rest FFields1 V UpdatedFFields1 *
U2 : lookup G F1 (recVal FFields1)
U5 : update_rec_fields Rest FFields1 V UpdatedFFields1
============================
(F1, recVal UpdatedFFields1)::G = (F1, recVal UpdatedFFields1)::G
< search.
Proof completed.
< Projection_Constraint proj_c_eval :
forall C C' G G2,
|{c}- C ~~> C' -> eval_c G C G2 -> exists G', eval_c G C' G'.
Proof completed.
< Ext_Size eval_c G C G1.
Proof completed.
< Proj_Rel eval_c G C G1.
Proof completed.
< Ext_Ind forall G C G1, eval_c G C G1.
Subgoal 1:
Variables: G1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G1 noop G1 0 @@
Acc : acc 0 @
============================
<eval_c {P}> G1 noop G1
< search.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 G1 N3 **
============================
<eval_c {P}> G (seq C1 C2) G1
< apply ext_size_is_int_eval_c to R2.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 G1 N3 **
H1 : is_integer N2
============================
<eval_c {P}> G (seq C1 C2) G1
< apply ext_size_is_int_eval_c to R3.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
============================
<eval_c {P}> G (seq C1 C2) G1
< apply ext_size_pos_eval_c to R2.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
============================
<eval_c {P}> G (seq C1 C2) G1
< apply ext_size_pos_eval_c to R3.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
============================
<eval_c {P}> G (seq C1 C2) G1
< Or2: apply lt_left to R1 _ _.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
============================
<eval_c {P}> G (seq C1 C2) G1
< Or3: apply lt_right to R1 _ _ _.
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G (seq C1 C2) G1
< A: case Acc (keep).
Subgoal 2:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G (seq C1 C2) G1
< Or2: case Or2.
Subgoal 2.1:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G (seq C1 C2) G1
< AN2: apply A to _ Or2.
Subgoal 2.1:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G (seq C1 C2) G1
< apply IH to R2 AN2.
Subgoal 2.1:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
============================
<eval_c {P}> G (seq C1 C2) G1
< Or3: case Or3.
Subgoal 2.1.1:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
Or3 : N3 < N
============================
<eval_c {P}> G (seq C1 C2) G1
< AN3: apply A to _ Or3.
Subgoal 2.1.1:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_c {P}> G (seq C1 C2) G1
< apply IH to R3 AN3.
Subgoal 2.1.1:
Variables: N G G1 N2 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_c {P}> G2 C2 G1
============================
<eval_c {P}> G (seq C1 C2) G1
< search.
Subgoal 2.1.2:
Variables: N G G1 N2 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
============================
<eval_c {P}> G (seq C1 C2) G1
< apply IH1 to R3 Acc.
Subgoal 2.1.2:
Variables: N G G1 N2 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : <eval_c {ES}> G C1 G2 N2 **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
H6 : <eval_c {P}> G2 C2 G1
============================
<eval_c {P}> G (seq C1 C2) G1
< search.
Subgoal 2.2:
Variables: N G G1 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G (seq C1 C2) G1
< apply IH1 to R2 Acc.
Subgoal 2.2:
Variables: N G G1 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
============================
<eval_c {P}> G (seq C1 C2) G1
< Or3: case Or3.
Subgoal 2.2.1:
Variables: N G G1 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
Or3 : N3 < N
============================
<eval_c {P}> G (seq C1 C2) G1
< AN3: apply A to _ Or3.
Subgoal 2.2.1:
Variables: N G G1 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_c {P}> G (seq C1 C2) G1
< apply IH to R3 AN3.
Subgoal 2.2.1:
Variables: N G G1 N3 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_c {P}> G2 C2 G1
============================
<eval_c {P}> G (seq C1 C2) G1
< search.
Subgoal 2.2.2:
Variables: N G G1 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
============================
<eval_c {P}> G (seq C1 C2) G1
< apply IH1 to R3 Acc.
Subgoal 2.2.2:
Variables: N G G1 G2 C2 C1
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (seq C1 C2) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : <eval_c {ES}> G C1 G2 N **
R3 : <eval_c {ES}> G2 C2 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_c {P}> G C1 G2
H6 : <eval_c {P}> G2 C2 G1
============================
<eval_c {P}> G (seq C1 C2) G1
< search.
Subgoal 3:
Variables: G V X E Ty
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (declare X Ty E) ((X, V)::G) 0 @@
Acc : acc 0 @
R1 : eval_e G E V
============================
<eval_c {P}> G (declare X Ty E) ((X, V)::G)
< search.
Subgoal 4:
Variables: G V X E
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (assign X E) ((X, V)::G) 0 @@
Acc : acc 0 @
R1 : eval_e G E V
============================
<eval_c {P}> G (assign X E) ((X, V)::G)
< search.
Subgoal 5:
Variables: N G G1 Else Then Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (ifThenElse Cond Then Else) G1 N @@
Acc : acc N @
R1 : eval_e G Cond trueVal
R2 : <eval_c {ES}> G Then G1 N **
============================
<eval_c {P}> G (ifThenElse Cond Then Else) G1
< apply IH1 to R2 Acc.
Subgoal 5:
Variables: N G G1 Else Then Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (ifThenElse Cond Then Else) G1 N @@
Acc : acc N @
R1 : eval_e G Cond trueVal
R2 : <eval_c {ES}> G Then G1 N **
H1 : <eval_c {P}> G Then G1
============================
<eval_c {P}> G (ifThenElse Cond Then Else) G1
< search.
Subgoal 6:
Variables: N G G1 Else Then Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (ifThenElse Cond Then Else) G1 N @@
Acc : acc N @
R1 : eval_e G Cond falseVal
R2 : <eval_c {ES}> G Else G1 N **
============================
<eval_c {P}> G (ifThenElse Cond Then Else) G1
< apply IH1 to R2 Acc.
Subgoal 6:
Variables: N G G1 Else Then Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (ifThenElse Cond Then Else) G1 N @@
Acc : acc N @
R1 : eval_e G Cond falseVal
R2 : <eval_c {ES}> G Else G1 N **
H1 : <eval_c {P}> G Else G1
============================
<eval_c {P}> G (ifThenElse Cond Then Else) G1
< search.
Subgoal 7:
Variables: G1 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G1 (while Cond Body) G1 0 @@
Acc : acc 0 @
R1 : eval_e G1 Cond falseVal
============================
<eval_c {P}> G1 (while Cond Body) G1
< search.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) G1 N3 **
============================
<eval_c {P}> G (while Cond Body) G1
< apply ext_size_is_int_eval_c to R3.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) G1 N3 **
H1 : is_integer N2
============================
<eval_c {P}> G (while Cond Body) G1
< apply ext_size_is_int_eval_c to R4.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
============================
<eval_c {P}> G (while Cond Body) G1
< apply ext_size_pos_eval_c to R3.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
============================
<eval_c {P}> G (while Cond Body) G1
< apply ext_size_pos_eval_c to R4.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
============================
<eval_c {P}> G (while Cond Body) G1
< Or2: apply lt_left to R1 _ _.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) G1 N3 **
H1 : is_integer N2
H2 : is_integer N3
H3 : 0 <= N2
H4 : 0 <= N3
Or2 : N2 < N \/ N2 = N
============================
<eval_c {P}> G (while Cond Body) G1
< Or3: apply lt_right to R1 _ _ _.
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G (while Cond Body) G1
< A: case Acc (keep).
Subgoal 8:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G (while Cond Body) G1
< Or2: case Or2.
Subgoal 8.1:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G (while Cond Body) G1
< AN2: apply A to _ Or2.
Subgoal 8.1:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G (while Cond Body) G1
< apply IH to R3 AN2.
Subgoal 8.1:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
============================
<eval_c {P}> G (while Cond Body) G1
< Or3: case Or3.
Subgoal 8.1.1:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
Or3 : N3 < N
============================
<eval_c {P}> G (while Cond Body) G1
< AN3: apply A to _ Or3.
Subgoal 8.1.1:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_c {P}> G (while Cond Body) G1
< apply IH to R4 AN3.
Subgoal 8.1.1:
Variables: N G G1 N2 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_c {P}> G2 (while Cond Body) G1
============================
<eval_c {P}> G (while Cond Body) G1
< search.
Subgoal 8.1.2:
Variables: N G G1 N2 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
============================
<eval_c {P}> G (while Cond Body) G1
< apply IH1 to R4 Acc.
Subgoal 8.1.2:
Variables: N G G1 N2 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N2 + N = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N2 **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
H6 : <eval_c {P}> G2 (while Cond Body) G1
============================
<eval_c {P}> G (while Cond Body) G1
< search.
Subgoal 8.2:
Variables: N G G1 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G (while Cond Body) G1
< apply IH1 to R3 Acc.
Subgoal 8.2:
Variables: N G G1 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
============================
<eval_c {P}> G (while Cond Body) G1
< Or3: case Or3.
Subgoal 8.2.1:
Variables: N G G1 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
Or3 : N3 < N
============================
<eval_c {P}> G (while Cond Body) G1
< AN3: apply A to _ Or3.
Subgoal 8.2.1:
Variables: N G G1 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
Or3 : N3 < N
AN3 : acc N3 *
============================
<eval_c {P}> G (while Cond Body) G1
< apply IH to R4 AN3.
Subgoal 8.2.1:
Variables: N G G1 N3 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N3 = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
Or3 : N3 < N
AN3 : acc N3 *
H6 : <eval_c {P}> G2 (while Cond Body) G1
============================
<eval_c {P}> G (while Cond Body) G1
< search.
Subgoal 8.2.2:
Variables: N G G1 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
============================
<eval_c {P}> G (while Cond Body) G1
< apply IH1 to R4 Acc.
Subgoal 8.2.2:
Variables: N G G1 G2 Body Cond
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (while Cond Body) G1 N @@
Acc : acc N @
R1 : N + N = N
R2 : eval_e G Cond trueVal
R3 : <eval_c {ES}> G Body G2 N **
R4 : <eval_c {ES}> G2 (while Cond Body) 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_c {P}> G Body G2
H6 : <eval_c {P}> G2 (while Cond Body) G1
============================
<eval_c {P}> G (while Cond Body) G1
< search.
Subgoal 9:
Variables: G V Fields Result Rec E RecFields
IH : forall N G C G1, <eval_c {ES}> G C G1 N -> acc N * -> <eval_c {P}> G C G1
IH1 : forall N G C G1,
<eval_c {ES}> G C G1 N ** -> acc N @ -> <eval_c {P}> G C G1
R : <eval_c {ES}> G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) 0 @@
Acc : acc 0 @
R1 : eval_e G E V
R2 : lookup G Rec (recVal Fields)
R3 : update_rec_fields RecFields Fields V Result
============================
<eval_c {P}> G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G)
< search.
Proof completed.
< Extensible_Theorem
eval_c_unique : forall G C G1 G2,
Ev1 : eval_c G C G1 ->
Ev2 : eval_c G C G2 ->
G1 = G2
on Ev1.
Subgoal 1:
Variables: G1 G2
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G1 noop G1 @
Ev2 : eval_c G1 noop G2
============================
G1 = G2
< case Ev2.
Subgoal 1:
Variables: G2
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G2 noop G2 @
============================
G2 = G2
< search.
Subgoal 2:
Variables: G G1 G2 G3 C2 C1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (seq C1 C2) G1 @
Ev2 : eval_c G (seq C1 C2) G2
Ev3 : eval_c G C1 G3 *
Ev4 : eval_c G3 C2 G1 *
============================
G1 = G2
< Ev2: case Ev2.
Subgoal 2:
Variables: G G1 G2 G3 C2 C1 G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (seq C1 C2) G1 @
Ev3 : eval_c G C1 G3 *
Ev4 : eval_c G3 C2 G1 *
Ev2 : eval_c G C1 G4
Ev5 : eval_c G4 C2 G2
============================
G1 = G2
< apply IH to Ev3 Ev2.
Subgoal 2:
Variables: G G1 G2 C2 C1 G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (seq C1 C2) G1 @
Ev3 : eval_c G C1 G4 *
Ev4 : eval_c G4 C2 G1 *
Ev2 : eval_c G C1 G4
Ev5 : eval_c G4 C2 G2
============================
G1 = G2
< apply IH to Ev4 Ev5.
Subgoal 2:
Variables: G G2 C2 C1 G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (seq C1 C2) G2 @
Ev3 : eval_c G C1 G4 *
Ev4 : eval_c G4 C2 G2 *
Ev2 : eval_c G C1 G4
Ev5 : eval_c G4 C2 G2
============================
G2 = G2
< search.
Subgoal 3:
Variables: G G2 V X E Ty
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (declare X Ty E) ((X, V)::G) @
Ev2 : eval_c G (declare X Ty E) G2
Ev3 : eval_e G E V
============================
(X, V)::G = G2
< Ev2: case Ev2.
Subgoal 3:
Variables: G V X E Ty V1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (declare X Ty E) ((X, V)::G) @
Ev3 : eval_e G E V
Ev2 : eval_e G E V1
============================
(X, V)::G = (X, V1)::G
< apply eval_e_unique to Ev3 Ev2.
Subgoal 3:
Variables: G X E Ty V1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (declare X Ty E) ((X, V1)::G) @
Ev3 : eval_e G E V1
Ev2 : eval_e G E V1
============================
(X, V1)::G = (X, V1)::G
< search.
Subgoal 4:
Variables: G G2 V X E
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (assign X E) ((X, V)::G) @
Ev2 : eval_c G (assign X E) G2
Ev3 : eval_e G E V
============================
(X, V)::G = G2
< Ev2: case Ev2.
Subgoal 4:
Variables: G V X E V1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (assign X E) ((X, V)::G) @
Ev3 : eval_e G E V
Ev2 : eval_e G E V1
============================
(X, V)::G = (X, V1)::G
< apply eval_e_unique to Ev3 Ev2.
Subgoal 4:
Variables: G X E V1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (assign X E) ((X, V1)::G) @
Ev3 : eval_e G E V1
Ev2 : eval_e G E V1
============================
(X, V1)::G = (X, V1)::G
< search.
Subgoal 5:
Variables: G G1 G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G1 @
Ev2 : eval_c G (ifThenElse Cond Then Else) G2
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Then G1 *
============================
G1 = G2
< Ev2: case Ev2.
Subgoal 5.1:
Variables: G G1 G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G1 @
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Then G1 *
Ev2 : eval_e G Cond trueVal
Ev5 : eval_c G Then G2
============================
G1 = G2
< apply IH to Ev4 Ev5.
Subgoal 5.1:
Variables: G G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G2 @
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Then G2 *
Ev2 : eval_e G Cond trueVal
Ev5 : eval_c G Then G2
============================
G2 = G2
< search.
Subgoal 5.2:
Variables: G G1 G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G1 @
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Then G1 *
Ev2 : eval_e G Cond falseVal
Ev5 : eval_c G Else G2
============================
G1 = G2
< apply eval_e_unique to Ev3 Ev2.
Subgoal 6:
Variables: G G1 G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G1 @
Ev2 : eval_c G (ifThenElse Cond Then Else) G2
Ev3 : eval_e G Cond falseVal
Ev4 : eval_c G Else G1 *
============================
G1 = G2
< Ev2: case Ev2.
Subgoal 6.1:
Variables: G G1 G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G1 @
Ev3 : eval_e G Cond falseVal
Ev4 : eval_c G Else G1 *
Ev2 : eval_e G Cond trueVal
Ev5 : eval_c G Then G2
============================
G1 = G2
< apply eval_e_unique to Ev3 Ev2.
Subgoal 6.2:
Variables: G G1 G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G1 @
Ev3 : eval_e G Cond falseVal
Ev4 : eval_c G Else G1 *
Ev2 : eval_e G Cond falseVal
Ev5 : eval_c G Else G2
============================
G1 = G2
< apply IH to Ev4 Ev5.
Subgoal 6.2:
Variables: G G2 Else Then Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (ifThenElse Cond Then Else) G2 @
Ev3 : eval_e G Cond falseVal
Ev4 : eval_c G Else G2 *
Ev2 : eval_e G Cond falseVal
Ev5 : eval_c G Else G2
============================
G2 = G2
< search.
Subgoal 7:
Variables: G1 G2 Body Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G1 (while Cond Body) G1 @
Ev2 : eval_c G1 (while Cond Body) G2
Ev3 : eval_e G1 Cond falseVal
============================
G1 = G2
< Ev2: case Ev2.
Subgoal 7.1:
Variables: G2 Body Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G2 (while Cond Body) G2 @
Ev3 : eval_e G2 Cond falseVal
Ev2 : eval_e G2 Cond falseVal
============================
G2 = G2
< search.
Subgoal 7.2:
Variables: G1 G2 Body Cond G3
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G1 (while Cond Body) G1 @
Ev3 : eval_e G1 Cond falseVal
Ev2 : eval_e G1 Cond trueVal
Ev4 : eval_c G1 Body G3
Ev5 : eval_c G3 (while Cond Body) G2
============================
G1 = G2
< apply eval_e_unique to Ev3 Ev2.
Subgoal 8:
Variables: G G1 G2 G3 Body Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (while Cond Body) G1 @
Ev2 : eval_c G (while Cond Body) G2
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Body G3 *
Ev5 : eval_c G3 (while Cond Body) G1 *
============================
G1 = G2
< Ev2: case Ev2.
Subgoal 8.1:
Variables: G1 G2 G3 Body Cond
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G2 (while Cond Body) G1 @
Ev3 : eval_e G2 Cond trueVal
Ev4 : eval_c G2 Body G3 *
Ev5 : eval_c G3 (while Cond Body) G1 *
Ev2 : eval_e G2 Cond falseVal
============================
G1 = G2
< apply eval_e_unique to Ev3 Ev2.
Subgoal 8.2:
Variables: G G1 G2 G3 Body Cond G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (while Cond Body) G1 @
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Body G3 *
Ev5 : eval_c G3 (while Cond Body) G1 *
Ev2 : eval_e G Cond trueVal
Ev6 : eval_c G Body G4
Ev7 : eval_c G4 (while Cond Body) G2
============================
G1 = G2
< apply IH to Ev4 Ev6.
Subgoal 8.2:
Variables: G G1 G2 Body Cond G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (while Cond Body) G1 @
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Body G4 *
Ev5 : eval_c G4 (while Cond Body) G1 *
Ev2 : eval_e G Cond trueVal
Ev6 : eval_c G Body G4
Ev7 : eval_c G4 (while Cond Body) G2
============================
G1 = G2
< apply IH to Ev5 Ev7.
Subgoal 8.2:
Variables: G G2 Body Cond G4
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (while Cond Body) G2 @
Ev3 : eval_e G Cond trueVal
Ev4 : eval_c G Body G4 *
Ev5 : eval_c G4 (while Cond Body) G2 *
Ev2 : eval_e G Cond trueVal
Ev6 : eval_c G Body G4
Ev7 : eval_c G4 (while Cond Body) G2
============================
G2 = G2
< search.
Subgoal 9:
Variables: G G2 V Fields Result Rec E RecFields
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev2 : eval_c G (recUpdate Rec RecFields E) G2
Ev3 : eval_e G E V
Ev4 : lookup G Rec (recVal Fields)
Ev5 : update_rec_fields RecFields Fields V Result
============================
(Rec, recVal Result)::G = G2
< Ev2: case Ev2.
Subgoal 9:
Variables: G V Fields Result Rec E RecFields V1 Fields1 Result1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev3 : eval_e G E V
Ev4 : lookup G Rec (recVal Fields)
Ev5 : update_rec_fields RecFields Fields V Result
Ev2 : eval_e G E V1
Ev6 : lookup G Rec (recVal Fields1)
Ev7 : update_rec_fields RecFields Fields1 V1 Result1
============================
(Rec, recVal Result)::G = (Rec, recVal Result1)::G
< apply lookup_unique to Ev4 Ev6.
Subgoal 9:
Variables: G V Result Rec E RecFields V1 Fields1 Result1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev3 : eval_e G E V
Ev4 : lookup G Rec (recVal Fields1)
Ev5 : update_rec_fields RecFields Fields1 V Result
Ev2 : eval_e G E V1
Ev6 : lookup G Rec (recVal Fields1)
Ev7 : update_rec_fields RecFields Fields1 V1 Result1
============================
(Rec, recVal Result)::G = (Rec, recVal Result1)::G
< apply eval_e_unique to Ev3 Ev2.
Subgoal 9:
Variables: G Result Rec E RecFields V1 Fields1 Result1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result)::G) @
Ev3 : eval_e G E V1
Ev4 : lookup G Rec (recVal Fields1)
Ev5 : update_rec_fields RecFields Fields1 V1 Result
Ev2 : eval_e G E V1
Ev6 : lookup G Rec (recVal Fields1)
Ev7 : update_rec_fields RecFields Fields1 V1 Result1
============================
(Rec, recVal Result)::G = (Rec, recVal Result1)::G
< apply update_rec_fields_unique to Ev5 Ev7.
Subgoal 9:
Variables: G Rec E RecFields V1 Fields1 Result1
IH : forall G C G1 G2, eval_c G C G1 * -> eval_c G C G2 -> G1 = G2
Ev1 : eval_c G (recUpdate Rec RecFields E) ((Rec, recVal Result1)::G) @
Ev3 : eval_e G E V1
Ev4 : lookup G Rec (recVal Fields1)
Ev5 : update_rec_fields RecFields Fields1 V1 Result1
Ev2 : eval_e G E V1
Ev6 : lookup G Rec (recVal Fields1)
Ev7 : update_rec_fields RecFields Fields1 V1 Result1
============================
(Rec, recVal Result1)::G = (Rec, recVal Result1)::G
< search.
Proof completed.
< Projection_Constraint proj_c_eval_results :
forall C C' G G1 G2 X V,
|{c}- C ~~> C' -> eval_c G C G1 -> eval_c G C' G2 -> lookup G1 X V -> lookup G2 X V.
Proof completed.
< Projection_Constraint proj_c_eval_results_back :
forall C C' G G1 G2 X V,
|{c}- C ~~> C' -> eval_c G C G1 -> eval_c G C' G2 -> lookup G2 X V -> lookup G1 X V.
Proof completed.
< Theorem vars_equiv_left :
forall (G1 : list (pair (string) value)) 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) value)) 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,
vars_equal_rf_same_result : forall G1 G2 RF D V1 V2,
Equiv : (forall X U1 U2,
mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
Vars : vars_rf RF D ->
Ev1 : eval_rf G1 RF V1 ->
Ev2 : eval_rf G2 RF V2 ->
V1 = V2
on Ev1.
Subgoal 1.1:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (num I) D
Ev1 : eval_e G1 (num I) (intVal I) @
Ev2 : eval_e G2 (num I) V2
============================
intVal I = V2
< case Ev2.
Subgoal 1.1:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (num I) D
Ev1 : eval_e G1 (num I) (intVal I) @
============================
intVal I = intVal I
< search.
Subgoal 1.2:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (plus E1 E2) D
Ev1 : eval_e G1 (plus E1 E2) (intVal I) @
Ev2 : eval_e G2 (plus E1 E2) V2
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 + I2 = I
============================
intVal I = V2
< Ev2: case Ev2.
Subgoal 1.2:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (plus E1 E2) D
Ev1 : eval_e G1 (plus E1 E2) (intVal I) @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
============================
intVal I = intVal I3
< Vars1: case Vars.
Subgoal 1.2:
Variables: G1 G2 D I1 I2 I E2 E1 I4 I5 I3 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (plus E1 E2) (intVal I) @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
intVal I = intVal I3
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.2.1:
Variables: G1 G2 D I1 I2 I E2 E1 I4 I5 I3 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (plus E1 E2) (intVal I) @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 + I2 = I
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.2:
Variables: G1 G2 D I2 I E2 E1 I4 I5 I3 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (plus E1 E2) (intVal I) @
Ev3 : eval_e G1 E1 (intVal I4) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I4 + I2 = I
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
intVal I = intVal I3
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.2.2:
Variables: G1 G2 D I2 I E2 E1 I4 I5 I3 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (plus E1 E2) (intVal I) @
Ev3 : eval_e G1 E1 (intVal I4) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I4 + I2 = I
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.2:
Variables: G1 G2 D I E2 E1 I4 I5 I3 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (plus E1 E2) (intVal I) @
Ev3 : eval_e G1 E1 (intVal I4) *
Ev4 : eval_e G1 E2 (intVal I5) *
Ev5 : I4 + I5 = I
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
intVal I = intVal I3
< apply plus_integer_unique to Ev5 Ev7.
Subgoal 1.2:
Variables: G1 G2 D E2 E1 I4 I5 I3 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (plus E1 E2) (intVal I3) @
Ev3 : eval_e G1 E1 (intVal I4) *
Ev4 : eval_e G1 E2 (intVal I5) *
Ev5 : I4 + I5 = I3
Ev2 : eval_e G2 E1 (intVal I4)
Ev6 : eval_e G2 E2 (intVal I5)
Ev7 : I4 + I5 = I3
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
intVal I3 = intVal I3
< search.
Subgoal 1.3:
Variables: G1 G2 D V1 V2 X
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (name X) D
Ev1 : eval_e G1 (name X) V1 @
Ev2 : eval_e G2 (name X) V2
Ev3 : lookup G1 X V1
============================
V1 = V2
< Ev2: case Ev2.
Subgoal 1.3:
Variables: G1 G2 D V1 V2 X
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (name X) D
Ev1 : eval_e G1 (name X) V1 @
Ev3 : lookup G1 X V1
Ev2 : lookup G2 X V2
============================
V1 = V2
< Vars: case Vars.
Subgoal 1.3:
Variables: G1 G2 V1 V2 X
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X1 U1 U2,
mem X1 [X] -> lookup G1 X1 U1 -> lookup G2 X1 U2 -> U1 = U2
Ev1 : eval_e G1 (name X) V1 @
Ev3 : lookup G1 X V1
Ev2 : lookup G2 X V2
============================
V1 = V2
< apply Equiv to _ Ev3 Ev2.
Subgoal 1.3:
Variables: G1 G2 V2 X
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X1 U1 U2,
mem X1 [X] -> lookup G1 X1 U1 -> lookup G2 X1 U2 -> U1 = U2
Ev1 : eval_e G1 (name X) V2 @
Ev3 : lookup G1 X V2
Ev2 : lookup G2 X V2
============================
V2 = V2
< search.
Subgoal 1.4:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (greater E1 E2) D
Ev1 : eval_e G1 (greater E1 E2) trueVal @
Ev2 : eval_e G2 (greater E1 E2) V2
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 > I2
============================
trueVal = V2
< Vars1: case Vars.
Subgoal 1.4:
Variables: G1 G2 D V2 I1 I2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev2 : eval_e G2 (greater E1 E2) V2
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.4.1:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
trueVal = trueVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.4.1.1:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.4.1:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
trueVal = trueVal
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.4.1.2:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.4.1:
Variables: G1 G2 D E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I4) *
Ev5 : I3 > I4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
trueVal = trueVal
< search.
Subgoal 1.4.2:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
trueVal = falseVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.4.2.1:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.4.2:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
trueVal = falseVal
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.4.2.2:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 > I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.4.2:
Variables: G1 G2 D E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) trueVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I4) *
Ev5 : I3 > I4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
trueVal = falseVal
< apply greater_lesseq_integer_false to Ev5 Ev7.
Subgoal 1.5:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (greater E1 E2) D
Ev1 : eval_e G1 (greater E1 E2) falseVal @
Ev2 : eval_e G2 (greater E1 E2) V2
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 <= I2
============================
falseVal = V2
< Vars1: case Vars.
Subgoal 1.5:
Variables: G1 G2 D V2 I1 I2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev2 : eval_e G2 (greater E1 E2) V2
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.5.1:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
falseVal = trueVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.5.1.1:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.5.1:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
falseVal = trueVal
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.5.1.2:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.5.1:
Variables: G1 G2 D E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I4) *
Ev5 : I3 <= I4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 > I4
============================
falseVal = trueVal
< apply greater_lesseq_integer_false to Ev7 Ev5.
Subgoal 1.5.2:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
falseVal = falseVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.5.2.1:
Variables: G1 G2 D I1 I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I1) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I1 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.5.2:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
falseVal = falseVal
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.5.2.2:
Variables: G1 G2 D I2 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I2) *
Ev5 : I3 <= I2
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.5.2:
Variables: G1 G2 D E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (greater E1 E2) falseVal @
Ev3 : eval_e G1 E1 (intVal I3) *
Ev4 : eval_e G1 E2 (intVal I4) *
Ev5 : I3 <= I4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 (intVal I3)
Ev6 : eval_e G2 E2 (intVal I4)
Ev7 : I3 <= I4
============================
falseVal = falseVal
< search.
Subgoal 1.6:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev2 : eval_e G2 (eq E1 E2) V2
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4
============================
trueVal = V2
< Vars1: case Vars.
Subgoal 1.6:
Variables: G1 G2 D V2 V3 V4 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev2 : eval_e G2 (eq E1 E2) V2
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.6.1:
Variables: G1 G2 D V3 V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6
============================
trueVal = trueVal
< search.
Subgoal 1.6.2:
Variables: G1 G2 D V3 V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6 -> false
============================
trueVal = falseVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.6.2.1:
Variables: G1 G2 D V3 V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6 -> false
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.6.2:
Variables: G1 G2 D V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V5 V4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6 -> false
============================
trueVal = falseVal
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.6.2.2:
Variables: G1 G2 D V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V5 V4
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6 -> false
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.6.2:
Variables: G1 G2 D E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) trueVal @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V6 *
Ev5 : val_eq V5 V6
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6 -> false
============================
trueVal = falseVal
< apply Ev7 to _.
Subgoal 1.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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev2 : eval_e G2 (eq E1 E2) V2
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4 -> false
============================
falseVal = V2
< Vars1: case Vars.
Subgoal 1.7:
Variables: G1 G2 D V2 V3 V4 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev2 : eval_e G2 (eq E1 E2) V2
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.7.1:
Variables: G1 G2 D V3 V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6
============================
falseVal = trueVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.7.1.1:
Variables: G1 G2 D V3 V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.7.1:
Variables: G1 G2 D V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V5 V4 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6
============================
falseVal = trueVal
< apply IH to _ Vars2 Ev4 Ev6.
Subgoal 1.7.1.2:
Variables: G1 G2 D V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V5 V4 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.7.1:
Variables: G1 G2 D E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev3 : eval_e G1 E1 V5 *
Ev4 : eval_e G1 E2 V6 *
Ev5 : val_eq V5 V6 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6
============================
falseVal = trueVal
< apply Ev5 to _.
Subgoal 1.7.2:
Variables: G1 G2 D V3 V4 E2 E1 D2 D3 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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) falseVal @
Ev3 : eval_e G1 E1 V3 *
Ev4 : eval_e G1 E2 V4 *
Ev5 : val_eq V3 V4 -> false
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 V5
Ev6 : eval_e G2 E2 V6
Ev7 : val_eq V5 V6 -> false
============================
falseVal = falseVal
< search.
Subgoal 1.8:
Variables: G1 G2 D V2 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (and E1 E2) D
Ev1 : eval_e G1 (and E1 E2) trueVal @
Ev2 : eval_e G2 (and E1 E2) V2
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
============================
trueVal = V2
< Vars1: case Vars.
Subgoal 1.8:
Variables: G1 G2 D V2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) trueVal @
Ev2 : eval_e G2 (and E1 E2) V2
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.8.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev5 : eval_e G2 E2 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.8.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
============================
trueVal = falseVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.8.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.8.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev5 : eval_e G2 E2 falseVal
============================
trueVal = falseVal
< apply IH to _ Vars2 Ev4 Ev5.
Subgoal 1.8.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev5 : eval_e G2 E2 falseVal
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.9:
Variables: G1 G2 D V2 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (and E1 E2) D
Ev1 : eval_e G1 (and E1 E2) falseVal @
Ev2 : eval_e G2 (and E1 E2) V2
Ev3 : eval_e G1 E1 falseVal *
============================
falseVal = V2
< Vars1: case Vars.
Subgoal 1.9:
Variables: G1 G2 D V2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev2 : eval_e G2 (and E1 E2) V2
Ev3 : eval_e G1 E1 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.9.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev4 : eval_e G2 E2 trueVal
============================
falseVal = trueVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.9.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev4 : eval_e G2 E2 trueVal
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.9.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.9.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev4 : eval_e G2 E2 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.10:
Variables: G1 G2 D V2 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (and E1 E2) D
Ev1 : eval_e G1 (and E1 E2) falseVal @
Ev2 : eval_e G2 (and E1 E2) V2
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 falseVal *
============================
falseVal = V2
< Vars1: case Vars.
Subgoal 1.10:
Variables: G1 G2 D V2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev2 : eval_e G2 (and E1 E2) V2
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.10.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev5 : eval_e G2 E2 trueVal
============================
falseVal = trueVal
< apply IH to _ Vars2 Ev4 Ev5.
Subgoal 1.10.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev5 : eval_e G2 E2 trueVal
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.10.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.10.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (and E1 E2) falseVal @
Ev3 : eval_e G1 E1 trueVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
Ev5 : eval_e G2 E2 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.11:
Variables: G1 G2 D V2 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (or E1 E2) D
Ev1 : eval_e G1 (or E1 E2) trueVal @
Ev2 : eval_e G2 (or E1 E2) V2
Ev3 : eval_e G1 E1 trueVal *
============================
trueVal = V2
< Vars1: case Vars.
Subgoal 1.11:
Variables: G1 G2 D V2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev2 : eval_e G2 (or E1 E2) V2
Ev3 : eval_e G1 E1 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.11.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.11.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev4 : eval_e G2 E2 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.11.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev4 : eval_e G2 E2 falseVal
============================
trueVal = falseVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.11.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev4 : eval_e G2 E2 falseVal
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.12:
Variables: G1 G2 D V2 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (or E1 E2) D
Ev1 : eval_e G1 (or E1 E2) trueVal @
Ev2 : eval_e G2 (or E1 E2) V2
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 trueVal *
============================
trueVal = V2
< Vars1: case Vars.
Subgoal 1.12:
Variables: G1 G2 D V2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev2 : eval_e G2 (or E1 E2) V2
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
trueVal = V2
< Ev2: case Ev2.
Subgoal 1.12.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.12.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev5 : eval_e G2 E2 trueVal
============================
trueVal = trueVal
< search.
Subgoal 1.12.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev5 : eval_e G2 E2 falseVal
============================
trueVal = falseVal
< apply IH to _ Vars2 Ev4 Ev5.
Subgoal 1.12.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) trueVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 trueVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev5 : eval_e G2 E2 falseVal
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.13:
Variables: G1 G2 D V2 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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (or E1 E2) D
Ev1 : eval_e G1 (or E1 E2) falseVal @
Ev2 : eval_e G2 (or E1 E2) V2
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
============================
falseVal = V2
< Vars1: case Vars.
Subgoal 1.13:
Variables: G1 G2 D V2 E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) falseVal @
Ev2 : eval_e G2 (or E1 E2) V2
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
============================
falseVal = V2
< Ev2: case Ev2.
Subgoal 1.13.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
============================
falseVal = trueVal
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 1.13.1:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 trueVal
============================
forall X U1 U2, mem X D2 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 1.13.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev5 : eval_e G2 E2 trueVal
============================
falseVal = trueVal
< apply IH to _ Vars2 Ev4 Ev5.
Subgoal 1.13.2:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev5 : eval_e G2 E2 trueVal
============================
forall X U1 U2, mem X D3 -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 1.13.3:
Variables: G1 G2 D E2 E1 D2 D3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (or E1 E2) falseVal @
Ev3 : eval_e G1 E1 falseVal *
Ev4 : eval_e G1 E2 falseVal *
Vars1 : vars E1 D2
Vars2 : vars E2 D3
Vars3 : D2 ++ D3 = D
Ev2 : eval_e G2 E1 falseVal
Ev5 : eval_e G2 E2 falseVal
============================
falseVal = falseVal
< search.
Subgoal 1.14:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars true D
Ev1 : eval_e G1 true trueVal @
Ev2 : eval_e G2 true V2
============================
trueVal = V2
< case Ev2.
Subgoal 1.14:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars true D
Ev1 : eval_e G1 true trueVal @
============================
trueVal = trueVal
< search.
Subgoal 1.15:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars false D
Ev1 : eval_e G1 false falseVal @
Ev2 : eval_e G2 false V2
============================
falseVal = V2
< case Ev2.
Subgoal 1.15:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars false D
Ev1 : eval_e G1 false falseVal @
============================
falseVal = falseVal
< search.
Subgoal 1.16:
Variables: G1 G2 D V2 FieldVals Fields
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (recBuild Fields) D
Ev1 : eval_e G1 (recBuild Fields) (recVal FieldVals) @
Ev2 : eval_e G2 (recBuild Fields) V2
Ev3 : eval_rf G1 Fields FieldVals *
============================
recVal FieldVals = V2
< Vars: case Vars.
Subgoal 1.16:
Variables: G1 G2 D V2 FieldVals Fields
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recBuild Fields) (recVal FieldVals) @
Ev2 : eval_e G2 (recBuild Fields) V2
Ev3 : eval_rf G1 Fields FieldVals *
Vars : vars_rf Fields D
============================
recVal FieldVals = V2
< Ev2: case Ev2.
Subgoal 1.16:
Variables: G1 G2 D FieldVals Fields FieldVals1
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recBuild Fields) (recVal FieldVals) @
Ev3 : eval_rf G1 Fields FieldVals *
Vars : vars_rf Fields D
Ev2 : eval_rf G2 Fields FieldVals1
============================
recVal FieldVals = recVal FieldVals1
< apply IH1 to _ Vars Ev3 Ev2.
Subgoal 1.16:
Variables: G1 G2 D Fields FieldVals1
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recBuild Fields) (recVal FieldVals1) @
Ev3 : eval_rf G1 Fields FieldVals1 *
Vars : vars_rf Fields D
Ev2 : eval_rf G2 Fields FieldVals1
============================
recVal FieldVals1 = recVal FieldVals1
< search.
Subgoal 1.17:
Variables: G1 G2 D V1 V2 Fields Field Rec
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars (recFieldAccess Rec Field) D
Ev1 : eval_e G1 (recFieldAccess Rec Field) V1 @
Ev2 : eval_e G2 (recFieldAccess Rec Field) V2
Ev3 : eval_e G1 Rec (recVal Fields) *
Ev4 : lookup Fields Field V1
============================
V1 = V2
< Vars: case Vars.
Subgoal 1.17:
Variables: G1 G2 D V1 V2 Fields Field Rec
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recFieldAccess Rec Field) V1 @
Ev2 : eval_e G2 (recFieldAccess Rec Field) V2
Ev3 : eval_e G1 Rec (recVal Fields) *
Ev4 : lookup Fields Field V1
Vars : vars Rec D
============================
V1 = V2
< Ev2: case Ev2.
Subgoal 1.17:
Variables: G1 G2 D V1 V2 Fields Field Rec Fields1
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recFieldAccess Rec Field) V1 @
Ev3 : eval_e G1 Rec (recVal Fields) *
Ev4 : lookup Fields Field V1
Vars : vars Rec D
Ev2 : eval_e G2 Rec (recVal Fields1)
Ev5 : lookup Fields1 Field V2
============================
V1 = V2
< apply IH to _ Vars Ev3 Ev2.
Subgoal 1.17:
Variables: G1 G2 D V1 V2 Field Rec Fields1
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recFieldAccess Rec Field) V1 @
Ev3 : eval_e G1 Rec (recVal Fields1) *
Ev4 : lookup Fields1 Field V1
Vars : vars Rec D
Ev2 : eval_e G2 Rec (recVal Fields1)
Ev5 : lookup Fields1 Field V2
============================
V1 = V2
< apply lookup_unique to Ev4 Ev5.
Subgoal 1.17:
Variables: G1 G2 D V2 Field Rec Fields1
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF 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 (recFieldAccess Rec Field) V2 @
Ev3 : eval_e G1 Rec (recVal Fields1) *
Ev4 : lookup Fields1 Field V2
Vars : vars Rec D
Ev2 : eval_e G2 Rec (recVal Fields1)
Ev5 : lookup Fields1 Field V2
============================
V2 = V2
< search.
Subgoal 2.1:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars_rf endRecFieldExprs D
Ev1 : eval_rf G1 endRecFieldExprs [] @
Ev2 : eval_rf G2 endRecFieldExprs V2
============================
[] = V2
< case Ev2.
Subgoal 2.1:
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars_rf endRecFieldExprs D
Ev1 : eval_rf G1 endRecFieldExprs [] @
============================
[] = []
< search.
Subgoal 2.2:
Variables: G1 G2 D V2 FVs V L Rest E
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Vars : vars_rf (addRecFieldExprs L E Rest) D
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V)::FVs) @
Ev2 : eval_rf G2 (addRecFieldExprs L E Rest) V2
Ev3 : eval_e G1 E V *
Ev4 : eval_rf G1 Rest FVs *
============================
(L, V)::FVs = V2
< Vars: case Vars.
Subgoal 2.2:
Variables: G1 G2 D V2 FVs V L Rest E DRest DE
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V)::FVs) @
Ev2 : eval_rf G2 (addRecFieldExprs L E Rest) V2
Ev3 : eval_e G1 E V *
Ev4 : eval_rf G1 Rest FVs *
Vars : vars_rf Rest DRest
Vars1 : vars E DE
Vars2 : DE ++ DRest = D
============================
(L, V)::FVs = V2
< Ev2: case Ev2.
Subgoal 2.2:
Variables: G1 G2 D FVs V L Rest E DRest DE FVs1 V3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V)::FVs) @
Ev3 : eval_e G1 E V *
Ev4 : eval_rf G1 Rest FVs *
Vars : vars_rf Rest DRest
Vars1 : vars E DE
Vars2 : DE ++ DRest = D
Ev2 : eval_e G2 E V3
Ev5 : eval_rf G2 Rest FVs1
============================
(L, V)::FVs = (L, V3)::FVs1
< apply IH to _ Vars1 Ev3 Ev2.
Subgoal 2.2.1:
Variables: G1 G2 D FVs V L Rest E DRest DE FVs1 V3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V)::FVs) @
Ev3 : eval_e G1 E V *
Ev4 : eval_rf G1 Rest FVs *
Vars : vars_rf Rest DRest
Vars1 : vars E DE
Vars2 : DE ++ DRest = D
Ev2 : eval_e G2 E V3
Ev5 : eval_rf G2 Rest FVs1
============================
forall X U1 U2, mem X DE -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_left.
Subgoal 2.2:
Variables: G1 G2 D FVs L Rest E DRest DE FVs1 V3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V3)::FVs) @
Ev3 : eval_e G1 E V3 *
Ev4 : eval_rf G1 Rest FVs *
Vars : vars_rf Rest DRest
Vars1 : vars E DE
Vars2 : DE ++ DRest = D
Ev2 : eval_e G2 E V3
Ev5 : eval_rf G2 Rest FVs1
============================
(L, V3)::FVs = (L, V3)::FVs1
< apply IH1 to _ Vars Ev4 Ev5.
Subgoal 2.2.2:
Variables: G1 G2 D FVs L Rest E DRest DE FVs1 V3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V3)::FVs) @
Ev3 : eval_e G1 E V3 *
Ev4 : eval_rf G1 Rest FVs *
Vars : vars_rf Rest DRest
Vars1 : vars E DE
Vars2 : DE ++ DRest = D
Ev2 : eval_e G2 E V3
Ev5 : eval_rf G2 Rest FVs1
============================
forall X U1 U2, mem X DRest -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
< backchain vars_equiv_right.
Subgoal 2.2:
Variables: G1 G2 D L Rest E DRest DE FVs1 V3
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
IH1 : forall G1 G2 RF D V1 V2,
(forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2) ->
vars_rf RF D -> eval_rf G1 RF V1 * -> eval_rf G2 RF V2 -> V1 = V2
Equiv : forall X U1 U2, mem X D -> lookup G1 X U1 -> lookup G2 X U2 -> U1 = U2
Ev1 : eval_rf G1 (addRecFieldExprs L E Rest) ((L, V3)::FVs1) @
Ev3 : eval_e G1 E V3 *
Ev4 : eval_rf G1 Rest FVs1 *
Vars : vars_rf Rest DRest
Vars1 : vars E DE
Vars2 : DE ++ DRest = D
Ev2 : eval_e G2 E V3
Ev5 : eval_rf G2 Rest FVs1
============================
(L, V3)::FVs1 = (L, V3)::FVs1
< search.
Proof completed.