Reasoning Details

 < 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.
Back to example home