Reasoning Details

 < Module exactEval:assert.
 < Prove_Constraint exactEval:host:proj_expr_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_expr_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_expr_other.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmt_unique.

Variables: L1 L2 S2 Msg E
PrA : L1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
PrB : L2 |{stmt}- assert E Msg ~~> S2
IsS : is_stmt (assert E Msg)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 ifThenElse E noop (printVal (errorExpr Msg intTy)) = S2
 < case PrB.

Variables: L1 L2 Msg E
PrA : L1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsS : is_stmt (assert E Msg)
IsL1 : is_list is_string L1
IsL2 : is_list is_string L2
Rel12 : forall X, mem X L1 -> mem X L2
Rel21 : forall X, mem X L2 -> mem X L1
============================
 ifThenElse E noop (printVal (errorExpr Msg intTy)) = ifThenElse E noop (printVal (errorExpr Msg intTy))
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmt_is.

Variables: L Msg E
Pr : L |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsS : is_stmt (assert E Msg)
IsL : is_list is_string L
============================
 is_stmt (ifThenElse E noop (printVal (errorExpr Msg intTy)))
 < case IsS.

Variables: L Msg E
Pr : L |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsL : is_list is_string L
H1 : is_expr E
H2 : is_expr Msg
============================
 is_stmt (ifThenElse E noop (printVal (errorExpr Msg intTy)))
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmt_other.

Variables: L L' Msg E
Pr : L |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsS : is_stmt (assert E Msg)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
 exists S'', L' |{stmt}- assert E Msg ~~> S''
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_fun_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_fun_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_param_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_param_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_program_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_program_is.

Proof completed.
 < Prove_Constraint exactEval:host:proj_typ_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_typ_is.

Proof completed.
 < Add_Proj_Rel exactEval:host:is_expr,
   exactEval:host:is_args,
   exactEval:host:is_recFieldExprs,
   exactEval:host:is_stmt.

Proof completed.
 < Prove_Ext_Ind exactEval:host:is_expr,
   exactEval:host:is_args,
   exactEval:host:is_recFieldExprs,
   exactEval:host:is_stmt.

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

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (assert Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
============================
 <is_stmt {P}> (assert Expr1 Expr)
 < apply IH to R1.

Subgoal 4.10:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (assert Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
============================
 <is_stmt {P}> (assert Expr1 Expr)
 < apply IH to R2.

Subgoal 4.10:

Variables: Expr Expr1
IH : forall E, is_expr E * -> <is_expr {P}> E
IH1 : forall A, is_args A * -> <is_args {P}> A
IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF
IH3 : forall S, is_stmt S * -> <is_stmt {P}> S
R : is_stmt (assert Expr1 Expr) @
R1 : is_expr Expr1 *
R2 : is_expr Expr *
H1 : <is_expr {P}> Expr1
H2 : <is_expr {P}> Expr
============================
 <is_stmt {P}> (assert Expr1 Expr)
 < search.

Proof completed.
 < Prove exactEval:host:is_args_nilArgs_or_consArgs.

Proof completed.
 < Prove exactEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs.

Proof completed.
 < Prove exactEval:host:vars_unique.

Proof completed.
 < Prove exactEval:host:vars_is.

Proof completed.
 < Prove exactEval:host:vars_exist,
         exactEval:host:varsArgs_exist,
         exactEval:host:varsRecFields_exist.

Proof completed.
 < Prove exactEval:host:stmtNames_is,
         exactEval:host:stmtNames_isCtx,
         exactEval:host:exprNames_is.

Subgoal 1.12:

Variables: N Ctx' NE NM Msg E
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (assert E Msg)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (assert E Msg) N Ctx' @
SN1 : exprNames Ctx' E NE *
SN2 : exprNames Ctx' Msg NM *
SN3 : NE ++ NM = N
============================
 is_list is_string N
 < case IsS.

Subgoal 1.12:

Variables: N Ctx' NE NM Msg E
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (assert E Msg) N Ctx' @
SN1 : exprNames Ctx' E NE *
SN2 : exprNames Ctx' Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
============================
 is_list is_string N
 < apply IH_E to _ _ SN1.

Subgoal 1.12:

Variables: N Ctx' NE NM Msg E
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (assert E Msg) N Ctx' @
SN1 : exprNames Ctx' E NE *
SN2 : exprNames Ctx' Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
H3 : is_list is_string NE
============================
 is_list is_string N
 < apply IH_E to _ _ SN2.

Subgoal 1.12:

Variables: N Ctx' NE NM Msg E
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (assert E Msg) N Ctx' @
SN1 : exprNames Ctx' E NE *
SN2 : exprNames Ctx' Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
H3 : is_list is_string NE
H4 : is_list is_string NM
============================
 is_list is_string N
 < apply append_list_string_is to _ _ SN3.

Subgoal 1.12:

Variables: N Ctx' NE NM Msg E
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (assert E Msg) N Ctx' @
SN1 : exprNames Ctx' E NE *
SN2 : exprNames Ctx' Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
H3 : is_list is_string NE
H4 : is_list is_string NM
H5 : is_list is_string N
============================
 is_list is_string N
 < search.

Subgoal 2.12:

Variables: N Ctx' NE NM Msg E
IH_S : forall Ctx S N Ctx',
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
         is_list is_string N
IH_S_C : forall Ctx S N Ctx',
           is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * ->
           is_list (is_list is_string) Ctx'
IH_E : forall Ctx E N,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N
IH_A : forall Ctx A N,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N
IH_RF : forall Ctx RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          is_list is_string N
IsS : is_stmt (assert E Msg)
IsCtx : is_list (is_list is_string) Ctx'
SN : stmtNames Ctx' (assert E Msg) N Ctx' @
SN1 : exprNames Ctx' E NE *
SN2 : exprNames Ctx' Msg NM *
SN3 : NE ++ NM = N
============================
 is_list (is_list is_string) Ctx'
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_unique,
         exactEval:host:exprNames_unique.

Subgoal 1.12:

Variables: NA CtxA NB CtxB NE NM Msg E
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsS : is_stmt (assert E Msg)
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (assert E Msg) NA CtxA @
SNB : stmtNames CtxA (assert E Msg) NB CtxB
SNA1 : exprNames CtxA E NE *
SNA2 : exprNames CtxA Msg NM *
SNA3 : NE ++ NM = NA
============================
 NA = NB /\ CtxA = CtxB
 < case IsS.

Subgoal 1.12:

Variables: NA CtxA NB CtxB NE NM Msg E
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxA
SNA : stmtNames CtxA (assert E Msg) NA CtxA @
SNB : stmtNames CtxA (assert E Msg) NB CtxB
SNA1 : exprNames CtxA E NE *
SNA2 : exprNames CtxA Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
============================
 NA = NB /\ CtxA = CtxB
 < SNB: case SNB.

Subgoal 1.12:

Variables: NA NB CtxB NE NM Msg E NE1 NM1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (assert E Msg) NA CtxB @
SNA1 : exprNames CtxB E NE *
SNA2 : exprNames CtxB Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames CtxB E NE1
SNB1 : exprNames CtxB Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply IH_E to _ _ SNA1 SNB.

Subgoal 1.12:

Variables: NA NB CtxB NM Msg E NE1 NM1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (assert E Msg) NA CtxB @
SNA1 : exprNames CtxB E NE1 *
SNA2 : exprNames CtxB Msg NM *
SNA3 : NE1 ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames CtxB E NE1
SNB1 : exprNames CtxB Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply IH_E to _ _ SNA2 SNB1.

Subgoal 1.12:

Variables: NA NB CtxB Msg E NE1 NM1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (assert E Msg) NA CtxB @
SNA1 : exprNames CtxB E NE1 *
SNA2 : exprNames CtxB Msg NM1 *
SNA3 : NE1 ++ NM1 = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames CtxB E NE1
SNB1 : exprNames CtxB Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 NA = NB /\ CtxB = CtxB
 < apply append_unique to SNA3 SNB2.

Subgoal 1.12:

Variables: NB CtxB Msg E NE1 NM1
IH_S : forall Ctx S NA CtxA NB CtxB,
         is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * ->
         stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB
IH_E : forall Ctx E NA NB,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * ->
         exprNames Ctx E NB -> NA = NB
IH_A : forall Ctx A NA NB,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * ->
         argsNames Ctx A NB -> NA = NB
IH_RF : forall Ctx RF NA NB,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * ->
          recFieldNames Ctx RF NB -> NA = NB
IsCtx : is_list (is_list is_string) CtxB
SNA : stmtNames CtxB (assert E Msg) NB CtxB @
SNA1 : exprNames CtxB E NE1 *
SNA2 : exprNames CtxB Msg NM1 *
SNA3 : NE1 ++ NM1 = NB
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames CtxB E NE1
SNB1 : exprNames CtxB Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 NB = NB /\ CtxB = CtxB
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_keep_older.

Subgoal 12:

Variables: Scope Ctx N NE NM Msg E
IH : forall Scope Ctx S N Ctx',
       is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
       exists Scope',
         Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
IsS : is_stmt (assert E Msg)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @
SN1 : exprNames (Scope::Ctx) E NE *
SN2 : exprNames (Scope::Ctx) Msg NM *
SN3 : NE ++ NM = N
============================
 exists Scope',
   Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_exists,
         exactEval:host:exprNames_exists,
         exactEval:host:argsNames_exists,
         exactEval:host:recFieldNames_exists.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (assert Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_expr Expr1 *
IsS2 : is_expr Expr *
============================
 exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
 < ENE: apply IH_E to IsS1 IsCtx.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 N
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (assert Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_expr Expr1 *
IsS2 : is_expr Expr *
ENE : exprNames (Scope::Ctx) Expr1 N
============================
 exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
 < ENM: apply IH_E to IsS2 IsCtx.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (assert Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_expr Expr1 *
IsS2 : is_expr Expr *
ENE : exprNames (Scope::Ctx) Expr1 N
ENM : exprNames (Scope::Ctx) Expr N1
============================
 exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
 < Is1: apply exprNames_is to _ _ ENE.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (assert Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_expr Expr1 *
IsS2 : is_expr Expr *
ENE : exprNames (Scope::Ctx) Expr1 N
ENM : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
============================
 exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
 < Is2: apply exprNames_is to _ _ ENM.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 N N1
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (assert Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_expr Expr1 *
IsS2 : is_expr Expr *
ENE : exprNames (Scope::Ctx) Expr1 N
ENM : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
============================
 exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
 < apply append_list_string_total to Is1 Is2.

Subgoal 1.10:

Variables: Scope Ctx Expr Expr1 N N1 L3
IH_S : forall Scope Ctx S,
         is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx',
           stmtNames (Scope::Ctx) S N Ctx'
IH_E : forall Ctx E,
         is_expr E * -> is_list (is_list is_string) Ctx -> exists N,
           exprNames Ctx E N
IH_A : forall Ctx A,
         is_args A * -> is_list (is_list is_string) Ctx -> exists N,
           argsNames Ctx A N
IH_RF : forall Ctx RF,
          is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N,
            recFieldNames Ctx RF N
IsS : is_stmt (assert Expr1 Expr) @
IsCtx : is_list (is_list is_string) (Scope::Ctx)
IsS1 : is_expr Expr1 *
IsS2 : is_expr Expr *
ENE : exprNames (Scope::Ctx) Expr1 N
ENM : exprNames (Scope::Ctx) Expr N1
Is1 : is_list is_string N
Is2 : is_list is_string N1
H1 : N ++ N1 = L3
============================
 exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
 < search.

Proof completed.
 < Prove exactEval:host:stmtNames_not_in_ctx,
         exactEval:host:exprNames_not_in_ctx.

Subgoal 1.12:

Variables: Scope Ctx N X NE NM Msg E
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsS : is_stmt (assert E Msg)
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) E NE *
SN2 : exprNames (Scope::Ctx) Msg NM *
SN3 : NE ++ NM = N
============================
 false
 < case IsS.

Subgoal 1.12:

Variables: Scope Ctx N X NE NM Msg E
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) E NE *
SN2 : exprNames (Scope::Ctx) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
============================
 false
 < Or: apply mem_append to MemN SN3.

Subgoal 1.12:

Variables: Scope Ctx N X NE NM Msg E
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) E NE *
SN2 : exprNames (Scope::Ctx) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
Or : mem X NE \/ mem X NM
============================
 false
 < M: case Or.

Subgoal 1.12.1:

Variables: Scope Ctx N X NE NM Msg E
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) E NE *
SN2 : exprNames (Scope::Ctx) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
M : mem X NE
============================
 false
 < apply IH_E to _ _ SN1 M MemsCtx.

Subgoal 1.12.2:

Variables: Scope Ctx N X NE NM Msg E
IH_S : forall Scope Ctx S N Ctx' X,
         is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * ->
         mem X N -> mems X (Scope::Ctx) -> false
IH_E : forall Ctx E N X,
         is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N ->
         mems X Ctx -> false
IH_A : forall Ctx A N X,
         is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N ->
         mems X Ctx -> false
IH_RF : forall Ctx RF N X,
          is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * ->
          mem X N -> mems X Ctx -> false
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @
MemN : mem X N
MemsCtx : mems X (Scope::Ctx)
SN1 : exprNames (Scope::Ctx) E NE *
SN2 : exprNames (Scope::Ctx) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
M : mem X NM
============================
 false
 < apply IH_E to _ _ SN2 M MemsCtx.

Proof completed.
 < Prove exactEval:host:stmtNames_relatedCtxs,
         exactEval:host:stmtNames_relatedCtxs_ctx_fwd,
         exactEval:host:stmtNames_relatedCtxs_ctx_back,
         exactEval:host:exprNames_relatedCtxs.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) E NE *
SN2 : exprNames (ScopeA::CtxA) Msg NM *
SN3 : NE ++ NM = N
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
 < case IsS.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) E NE *
SN2 : exprNames (ScopeA::CtxA) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
 < apply IH_E to _ _ _ RelAB RelBA SN1.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) E NE *
SN2 : exprNames (ScopeA::CtxA) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
H3 : exprNames (ScopeB::CtxB) E NE
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
 < apply IH_E to _ _ _ RelAB RelBA SN2.

Subgoal 1.12:

Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)
RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)
SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @
SN1 : exprNames (ScopeA::CtxA) E NE *
SN2 : exprNames (ScopeA::CtxA) Msg NM *
SN3 : NE ++ NM = N
H1 : is_expr E
H2 : is_expr Msg
H3 : exprNames (ScopeB::CtxB) E NE
H4 : exprNames (ScopeB::CtxB) Msg NM
============================
 exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
 < search.

Subgoal 2.12:

Variables: NA CtxA' CtxB NB CtxB' X NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB
SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @
SNB : stmtNames CtxB (assert E Msg) NB CtxB'
Mems : mems X CtxA'
SNA1 : exprNames CtxA' E NE *
SNA2 : exprNames CtxA' Msg NM *
SNA3 : NE ++ NM = NA
============================
 mems X CtxB'
 < case IsS.

Subgoal 2.12:

Variables: NA CtxA' CtxB NB CtxB' X NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB
SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @
SNB : stmtNames CtxB (assert E Msg) NB CtxB'
Mems : mems X CtxA'
SNA1 : exprNames CtxA' E NE *
SNA2 : exprNames CtxA' Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
============================
 mems X CtxB'
 < SNB: case SNB.

Subgoal 2.12:

Variables: NA CtxA' NB CtxB' X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB'
SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @
Mems : mems X CtxA'
SNA1 : exprNames CtxA' E NE *
SNA2 : exprNames CtxA' Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames CtxB' E NE1
SNB1 : exprNames CtxB' Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 mems X CtxB'
 < backchain RelAB.

Subgoal 3.12:

Variables: NA CtxA' CtxB NB CtxB' X NE NM Msg E
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB
RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA'
SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @
SNB : stmtNames CtxB (assert E Msg) NB CtxB'
Mems : mems X CtxB'
SNA1 : exprNames CtxA' E NE *
SNA2 : exprNames CtxA' Msg NM *
SNA3 : NE ++ NM = NA
============================
 mems X CtxA'
 < SNB: case SNB.

Subgoal 3.12:

Variables: NA CtxA' NB CtxB' X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X,
           mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * ->
         exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB'
IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X,
             is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
             (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * ->
             stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA'
IH_E : forall CtxA CtxB E N,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N
IH_A : forall CtxA CtxB A N,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
           mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N
IH_RF : forall CtxA CtxB RF N,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X, mems X CtxA -> mems X CtxB) -> (forall X,
            mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) CtxA'
IsCtxB : is_list (is_list is_string) CtxB'
RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA'
SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @
Mems : mems X CtxB'
SNA1 : exprNames CtxA' E NE *
SNA2 : exprNames CtxA' Msg NM *
SNA3 : NE ++ NM = NA
SNB : exprNames CtxB' E NE1
SNB1 : exprNames CtxB' Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 mems X CtxA'
 < backchain RelBA.

Proof completed.
 < Prove exactEval:host:stmtNames_increaseCtxs,
         exactEval:host:stmtNames_increaseCtxs_ctxs,
         exactEval:host:exprNames_increaseCtxs.

Subgoal 1.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NE NM Msg E
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (assert E Msg) NB CtxB'
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
============================
 mem X NA
 < case IsS.

Subgoal 1.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NE NM Msg E
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (assert E Msg) NB CtxB'
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
============================
 mem X NA
 < SNB: case SNB.

Subgoal 1.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
============================
 mem X NA
 < Or: apply mem_append to M SNB2.

Subgoal 1.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
Or : mem X NE1 \/ mem X NM1
============================
 mem X NA
 < M': case Or.

Subgoal 1.12.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
M' : mem X NE1
============================
 mem X NA
 < ME: apply IH_E to _ _ _ _ SNA1 SNB M'.

Subgoal 1.12.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
M' : mem X NE1
ME : mem X NE
============================
 mem X NA
 < apply mem_append_left to ME SNA3.

Subgoal 1.12.1:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
M' : mem X NE1
ME : mem X NE
H3 : mem X NA
============================
 mem X NA
 < search.

Subgoal 1.12.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
M' : mem X NM1
============================
 mem X NA
 < MM: apply IH_E to _ _ _ _ SNA2 SNB1 M'.

Subgoal 1.12.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
M' : mem X NM1
MM : mem X NM
============================
 mem X NA
 < apply mem_append_right to MM SNA3.

Subgoal 1.12.2:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mem X NB
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : is_expr E
H2 : is_expr Msg
SNB : exprNames (ScopeB::CtxB) E NE1
SNB1 : exprNames (ScopeB::CtxB) Msg NM1
SNB2 : NE1 ++ NM1 = NB
M' : mem X NM1
MM : mem X NM
H3 : mem X NA
============================
 mem X NA
 < search.

Subgoal 2.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NE NM Msg E
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
SNB : stmtNames (ScopeB::CtxB) (assert E Msg) NB CtxB'
M : mems X (ScopeA::CtxA)
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
============================
 mems X CtxB'
 < case SNB.

Subgoal 2.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : exprNames (ScopeB::CtxB) E NE1
H2 : exprNames (ScopeB::CtxB) Msg NM1
H3 : NE1 ++ NM1 = NB
============================
 mems X (ScopeB::CtxB)
 < apply RelAB to M.

Subgoal 2.12:

Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1
IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
         is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
         (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
         stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA
IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X,
           is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) ->
           (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * ->
           stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB'
IH_E : forall CtxA E NA CtxB NB X,
         is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB ->
         mem X NB -> mem X NA
IH_A : forall CtxA A NA CtxB NB X,
         is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
         (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB ->
         mem X NB -> mem X NA
IH_RF : forall CtxA RF NA CtxB NB X,
          is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB ->
          (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * ->
          recFieldNames CtxB RF NB -> mem X NB -> mem X NA
IsS : is_stmt (assert E Msg)
IsCtxA : is_list (is_list is_string) (ScopeA::CtxA)
IsCtxB : is_list (is_list is_string) (ScopeB::CtxB)
RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)
SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @
M : mems X (ScopeA::CtxA)
SNA1 : exprNames (ScopeA::CtxA) E NE *
SNA2 : exprNames (ScopeA::CtxA) Msg NM *
SNA3 : NE ++ NM = NA
H1 : exprNames (ScopeB::CtxB) E NE1
H2 : exprNames (ScopeB::CtxB) Msg NM1
H3 : NE1 ++ NM1 = NB
H4 : mems X (ScopeB::CtxB)
============================
 mems X (ScopeB::CtxB)
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_exprNames.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmtNames.

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsS : is_stmt (assert E Msg)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx'
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mem X N_P
============================
 mem X N
 < case IsS.

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx'
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
============================
 mem X N
 < SN: case SN.

Variables: Names Scope Ctx N N_P Ctx'_P X Msg E NE NM
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
============================
 mem X N
 < SN_P: case SN_P.

Variables: Names Scope Ctx N N_P X Msg E NE NM CN TN CtxT FN CtxF N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P1 : stmtNames ([]::(Scope::Ctx)) noop TN CtxT
SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF
SN_P3 : CN ++ TN = N2
SN_P4 : N2 ++ FN = N_P
============================
 mem X N
 < case SN_P1.

Variables: Names Scope Ctx N N_P X Msg E NE NM CN FN CtxF N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF
SN_P3 : CN ++ [] = N2
SN_P4 : N2 ++ FN = N_P
============================
 mem X N
 < SN_P: case SN_P2.

Variables: Names Scope Ctx N N_P X Msg E NE NM CN FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P3 : CN ++ [] = N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) (errorExpr Msg intTy) FN
============================
 mem X N
 < SN_P: case SN_P1.

Variables: Names Scope Ctx N N_P X Msg E NE NM CN FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P3 : CN ++ [] = N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
============================
 mem X N
 < apply exprNames_unique to _ _ SN SN_P.

Variables: Names Scope Ctx N N_P X Msg E NM CN FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E CN
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : CN ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P3 : CN ++ [] = N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
============================
 mem X N
 < apply append_nil_right to SN_P3.

Variables: Names Scope Ctx N N_P X Msg E NM FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P3 : N2 ++ [] = N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
============================
 mem X N
 < clear SN_P3.

Variables: Names Scope Ctx N N_P X Msg E NM FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
============================
 mem X N
 < SN': apply exprNames_relatedCtxs to _ _ _ _ _ SN_P1 with
          CtxB = Scope::Ctx.

Subgoal 1:

Variables: Names Scope Ctx N N_P X Msg E NM FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
============================
 forall X, mems X ([]::(Scope::Ctx)) -> mems X (Scope::Ctx)
 < intros M'.

Subgoal 1:

Variables: Names Scope Ctx N N_P X Msg E NM FN N2 X1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
M' : mems X1 ([]::(Scope::Ctx))
============================
 mems X1 (Scope::Ctx)
 < M': case M'.

Subgoal 1.1:

Variables: Names Scope Ctx N N_P X Msg E NM FN N2 X1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
M' : mem X1 []
============================
 mems X1 (Scope::Ctx)
 < case M'.

Subgoal 1.2:

Variables: Names Scope Ctx N N_P X Msg E NM FN N2 X1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
M' : mems X1 (Scope::Ctx)
============================
 mems X1 (Scope::Ctx)
 < search.

Variables: Names Scope Ctx N N_P X Msg E NM FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : N2 ++ NM = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
SN' : exprNames (Scope::Ctx) Msg FN
============================
 mem X N
 < apply exprNames_unique to _ _ SN1 SN'.

Variables: Names Scope Ctx N N_P X Msg E FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg FN
SN2 : N2 ++ FN = N
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
SN' : exprNames (Scope::Ctx) Msg FN
============================
 mem X N
 < apply append_unique to SN2 SN_P4.

Variables: Names Scope Ctx N_P X Msg E FN N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mem X N_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E N2
SN1 : exprNames (Scope::Ctx) Msg FN
SN2 : N2 ++ FN = N_P
SN_P : exprNames (Scope::Ctx) E N2
SN_P4 : N2 ++ FN = N_P
SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN
SN' : exprNames (Scope::Ctx) Msg FN
============================
 mem X N_P
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmtNames_names_forward.

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsS : is_stmt (assert E Msg)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx'
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mems X Ctx'
============================
 mems X Ctx'_P
 < case IsS.

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx'
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mems X Ctx'
H1 : is_expr E
H2 : is_expr Msg
============================
 mems X Ctx'_P
 < SN: case SN.

Variables: Names Scope Ctx N N_P Ctx'_P X Msg E NE NM
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mems X (Scope::Ctx)
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
============================
 mems X Ctx'_P
 < SN_P: case SN_P.

Variables: Names Scope Ctx N N_P X Msg E NE NM CN TN CtxT FN CtxF N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P1 : stmtNames ([]::(Scope::Ctx)) noop TN CtxT
SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF
SN_P3 : CN ++ TN = N2
SN_P4 : N2 ++ FN = N_P
============================
 mems X (Scope::Ctx)
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_stmtNames_names_backward.

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsS : is_stmt (assert E Msg)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx'
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mems X Ctx'_P
============================
 mems X Ctx'
 < case IsS.

Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx'
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mems X Ctx'_P
H1 : is_expr E
H2 : is_expr Msg
============================
 mems X Ctx'
 < SN: case SN.

Variables: Names Scope Ctx N N_P Ctx'_P X Msg E NE NM
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P
M : mems X Ctx'_P
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
============================
 mems X (Scope::Ctx)
 < SN_P: case SN_P.

Variables: Names Scope Ctx N N_P X Msg E NE NM CN TN CtxT FN CtxF N2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) (Scope::Ctx)
M : mems X (Scope::Ctx)
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames (Scope::Ctx) E NE
SN1 : exprNames (Scope::Ctx) Msg NM
SN2 : NE ++ NM = N
SN_P : exprNames (Scope::Ctx) E CN
SN_P1 : stmtNames ([]::(Scope::Ctx)) noop TN CtxT
SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF
SN_P3 : CN ++ TN = N2
SN_P4 : N2 ++ FN = N_P
============================
 mems X (Scope::Ctx)
 < search.

Proof completed.
 < Prove exactEval:host:typeOf_isTy,
         exactEval:host:stmtOK_isCtx.

Subgoal 2.12:

Variables: FT ET' Msg E
IH : forall E FT ET Ty,
       is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * ->
       is_typ Ty
IH1 : forall S FT ET ET',
        is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
        is_list (is_list (is_pair is_string is_typ)) ET'
IH2 : forall A FT ET Tys,
        is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * ->
        is_list is_typ Tys
IH3 : forall RF FT ET Fields,
        is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
        is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * ->
        is_recFieldTys Fields
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
Ty : stmtOK FT ET' (assert E Msg) ET' @
Ty1 : typeOf FT ET' E boolTy *
Ty2 : typeOf FT ET' Msg stringTy *
============================
 is_list (is_list (is_pair is_string is_typ)) ET'
 < search.

Proof completed.
 < Prove exactEval:host:stmtOK_keep_scopes.

Subgoal 12:

Variables: FT ET' N Msg E
IH : forall FT ET S ET' N,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * ->
       length ET N -> length ET' N
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
Ty : stmtOK FT ET' (assert E Msg) ET' @
L : length ET' N
Ty1 : typeOf FT ET' E boolTy *
Ty2 : typeOf FT ET' Msg stringTy *
============================
 length ET' N
 < search.

Proof completed.
 < Prove exactEval:host:stmtOK_older_scopes_same.

Subgoal 12:

Variables: FT ET Scope Msg E
IH : forall FT ET S ET' Scope,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * ->
       exists Scope', ET' = Scope'::ET
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET)
Ty : stmtOK FT (Scope::ET) (assert E Msg) (Scope::ET) @
Ty1 : typeOf FT (Scope::ET) E boolTy *
Ty2 : typeOf FT (Scope::ET) Msg stringTy *
============================
 exists Scope', Scope::ET = Scope'::ET
 < search.

Proof completed.
 < Prove exactEval:host:stmtOK_first_scope_lookup_same.

Subgoal 12:

Variables: FT ET Scope' X Ty Msg E
IH : forall FT ET S Scope Scope' X Ty,
       is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
       is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * ->
       lookup Scope X Ty -> lookup Scope' X Ty
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET)
Ty : stmtOK FT (Scope'::ET) (assert E Msg) (Scope'::ET) @
L : lookup Scope' X Ty
Ty1 : typeOf FT (Scope'::ET) E boolTy *
Ty2 : typeOf FT (Scope'::ET) Msg stringTy *
============================
 lookup Scope' X Ty
 < search.

Proof completed.
 < Prove exactEval:host:typeOf_unique,
         exactEval:host:stmtOK_unique.

Subgoal 2.12:

Variables: FT ET_B ET_A' ET_B' Msg E
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A'
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B
TyA : stmtOK FT ET_A' (assert E Msg) ET_A' @
TyB : stmtOK FT ET_B (assert E Msg) ET_B'
Lkp : lookup_all_scopes ET_A' ET_B
TyA1 : typeOf FT ET_A' E boolTy *
TyA2 : typeOf FT ET_A' Msg stringTy *
============================
 lookup_all_scopes ET_A' ET_B'
 < case TyB.

Subgoal 2.12:

Variables: FT ET_A' ET_B' Msg E
IH_E : forall FT ET_A ET_B E TyA TyB,
         is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B ->
         TyA = TyB
IH_S : forall FT ET_A ET_B S ET_A' ET_B',
         is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B ->
         lookup_all_scopes ET_A' ET_B'
IH_A : forall FT ET_A ET_B A TysA TysB,
         is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
         is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
         typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B ->
         TysA = TysB
IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
          is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B ->
          typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB ->
          lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsA : is_list (is_list (is_pair is_string is_typ)) ET_A'
IsB : is_list (is_list (is_pair is_string is_typ)) ET_B'
TyA : stmtOK FT ET_A' (assert E Msg) ET_A' @
Lkp : lookup_all_scopes ET_A' ET_B'
TyA1 : typeOf FT ET_A' E boolTy *
TyA2 : typeOf FT ET_A' Msg stringTy *
H1 : typeOf FT ET_B' E boolTy
H2 : typeOf FT ET_B' Msg stringTy
============================
 lookup_all_scopes ET_A' ET_B'
 < search.

Proof completed.
 < Prove exactEval:host:paramTy_is.

Proof completed.
 < Prove exactEval:host:getFunInfo_is.

Proof completed.
 < Prove exactEval:host:paramTy_exists.

Proof completed.
 < Prove exactEval:host:getFunInfo_exists.

Proof completed.
 < Prove exactEval:host:evalExpr_isCtx,
         exactEval:host:evalExpr_isValue,
         exactEval:host:evalStmt_isCtx,
         exactEval:host:evalArgs_isCtx,
         exactEval:host:evalArgs_isValue,
         exactEval:host:evalRecFields_isCtx,
         exactEval:host:evalRecFields_isValue.

Subgoal 3.15:

Variables: FE EE EE' O Msg E
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < case IsS.

Subgoal 3.15:

Variables: FE EE EE' O Msg E
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < apply IH_C_E to _ _ _ Ev1.

Subgoal 3.15:

Variables: FE EE EE' O Msg E
IH_C_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_E : forall FE EE EE' E V O,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
           is_value V
IH_C_S : forall FE EE EE' S O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_C_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list (is_list (is_pair is_string is_value)) EE'
IH_V_A : forall FE EE EE' A V O,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
           is_list is_value V
IH_C_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_list (is_pair is_string is_value)) EE'
IH_V_RF : forall FE EE EE' RF V O,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
            is_list (is_pair is_string is_value) V
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
H3 : is_list (is_list (is_pair is_string is_value)) EE'
============================
 is_list (is_list (is_pair is_string is_value)) EE'
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_isOutput,
         exactEval:host:evalStmt_isOutput,
         exactEval:host:evalArgs_isOutput,
         exactEval:host:evalRecFields_isOutput.

Subgoal 2.15:

Variables: FE EE EE' O Msg E
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
============================
 is_list is_value O
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O Msg E
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 is_list is_value O
 < apply IH_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O Msg E
IH_E : forall FE EE EE' E V O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         is_list is_value O
IH_S : forall FE EE EE' S O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         is_list is_value O
IH_A : forall FE EE EE' A V O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         is_list is_value O
IH_RF : forall FE EE EE' RF V O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          is_list is_value O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
H3 : is_list is_value O
============================
 is_list is_value O
 < search.

Proof completed.
 < Prove exactEval:host:paramName_is.

Proof completed.
 < Prove exactEval:host:getFunEvalInfo_is.

Proof completed.
 < Prove exactEval:host:evalProgram_isOutput.

Proof completed.
 < Prove exactEval:host:evalExpr_names_same,
         exactEval:host:evalStmt_names_same,
         exactEval:host:evalArgs_names_same,
         exactEval:host:evalRecFields_names_same.

Subgoal 2.15:

Variables: FE Scope EE EE' O Msg E
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (assert E Msg) EE' O @
Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O *
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case IsS.

Subgoal 2.15:

Variables: FE Scope EE EE' O Msg E
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (assert E Msg) EE' O @
Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < NS: apply IH_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE Scope EE EE' O Msg E
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (assert E Msg) EE' O @
Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
NS : names_same (Scope::EE) EE'
============================
 exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
 < case NS.

Subgoal 2.15:

Variables: FE Scope EE O Msg E BRest B
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         names_same EE EE'
IH_S : forall S FE Scope EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * ->
         exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
IH_A : forall A FE EE V EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * ->
         names_same EE EE'
IH_RF : forall RF FE EE V EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * ->
          names_same EE EE'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE)
Ev : evalStmt FE (Scope::EE) (assert E Msg) (B::BRest) O @
Ev1 : evalExpr FE (Scope::EE) E trueVal (B::BRest) O *
H1 : is_expr E
H2 : is_expr Msg
H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B
H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope
H5 : names_same EE BRest
============================
 exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_newNameScopes,
         exactEval:host:evalExpr_newNameScopes_output,
         exactEval:host:evalExpr_newNameScopes_ctx,
         exactEval:host:evalStmt_newNameScopes_output,
         exactEval:host:evalStmt_newNameScopes,
         exactEval:host:evalArgs_newNameScopes,
         exactEval:host:evalArgs_newNameScopes_output,
         exactEval:host:evalArgs_newNameScopes_ctx,
         exactEval:host:evalRecFields_newNameScopes,
         exactEval:host:evalRecFields_newNameScopes_output,
         exactEval:host:evalRecFields_newNameScopes_ctx.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
============================
 O_A = O_B
 < case IsS.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
H1 : is_expr E
H2 : is_expr Msg
============================
 O_A = O_B
 < EvB: case EvB.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B
============================
 O_A = O_B
 < apply IH_O_E to _ _ _ _ EvA1 EvB _.

Subgoal 4.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_B *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B
============================
 O_B = O_B
 < search.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
============================
 newNameScopes N Len EE_A' EE_B'
 < case IsS.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
H1 : is_expr E
H2 : is_expr Msg
============================
 newNameScopes N Len EE_A' EE_B'
 < EvB: case EvB.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B
============================
 newNameScopes N Len EE_A' EE_B'
 < apply IH_C_E to _ _ _ _ EvA1 EvB _.

Subgoal 5.15:

Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E
IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
           evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B ->
           newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> VA = VB
IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> O_A = O_B
IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B ->
            newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B
H3 : newNameScopes N Len EE_A' EE_B'
============================
 newNameScopes N Len EE_A' EE_B'
 < search.

Proof completed.
 < Add_Ext_Size exactEval:host:evalExpr,
   exactEval:host:evalArgs,
   exactEval:host:evalRecFields,
   exactEval:host:evalStmt.

Proof completed.
 < Add_Proj_Rel exactEval:host:evalExpr,
   exactEval:host:evalArgs,
   exactEval:host:evalRecFields,
   exactEval:host:evalStmt.

Proof completed.
 < Prove exactEval:host:evalExpr_newNameScopes_exists_ES,
         exactEval:host:evalStmt_newNameScopes_exists_ES,
         exactEval:host:evalArgs_newNameScopes_exists_ES,
         exactEval:host:evalRecFields_newNameScopes_exists_ES.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 *
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 *
H1 : is_expr E
H2 : is_expr Msg
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
 < apply ext_size_is_int_evalExpr to EvB2.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 *
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
 < apply IH_E to _ _ _ _ EvB2 _.

Subgoal 2.15:

Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E EE_A'
IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES
IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES
IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
         exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES
IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B ->
          exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 *
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
H4 : <evalExpr {ES}> FE (Scope::EE_A) E trueVal EE_A' O N2
============================
 exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_ctx_names,
         exactEval:host:evalStmt_ctx_names,
         exactEval:host:evalArgs_ctx_names,
         exactEval:host:evalRecFields_ctx_names.

Subgoal 2.15:

Variables: FE EE EE' O Ctx Ctx' N Msg E
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) N Ctx'
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
============================
 ctx_names EE' Ctx'
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O Ctx Ctx' N Msg E
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) N Ctx'
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 ctx_names EE' Ctx'
 < SN: case SN.

Subgoal 2.15:

Variables: FE EE EE' O Ctx' N Msg E NE NM
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames Ctx' E NE
SN1 : exprNames Ctx' Msg NM
SN2 : NE ++ NM = N
============================
 ctx_names EE' Ctx'
 < apply IH_E to _ _ _ _ Ctxs SN Ev1.

Subgoal 2.15:

Variables: FE EE EE' O Ctx' N Msg E NE NM
IH_E : forall FE EE E V EE' O Ctx N,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx
IH_S : forall FE EE S EE' O Ctx Ctx' N,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * ->
         ctx_names EE' Ctx'
IH_A : forall FE EE A V EE' O Ctx N,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
         ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx
IH_RF : forall FE EE RF V EE' O Ctx N,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx ->
          ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * ->
          ctx_names EE' Ctx
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names EE Ctx'
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames Ctx' E NE
SN1 : exprNames Ctx' Msg NM
SN2 : NE ++ NM = N
H3 : ctx_names EE' Ctx'
============================
 ctx_names EE' Ctx'
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_newNameScopes_exists_back,
         exactEval:host:evalStmt_newNameScopes_exists_back,
         exactEval:host:evalArgs_newNameScopes_exists_back,
         exactEval:host:evalRecFields_newNameScopes_exists_back.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Msg E
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names (Scope::EE_B) Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O *
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Msg E
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names (Scope::EE_B) Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
 < SN: case SN.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Msg E NE NM
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O *
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames Ctx' E NE
SN1 : exprNames Ctx' Msg NM
SN2 : NE ++ NM = []
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
 < case SN2.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Msg E
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O *
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames Ctx' E []
SN1 : exprNames Ctx' Msg []
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
 < apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _.

Subgoal 2.15:

Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Msg E EE_B'
IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] ->
         evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) ->
         is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' ->
         evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B ->
         exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O
IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] ->
         evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] ->
          evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B ->
          exists EE_B', evalRecFields FE EE_B RF V EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A)
IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B)
IsCtx : is_list (is_list is_string) Ctx'
Ctxs : ctx_names (Scope::EE_B) Ctx'
EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O *
H1 : is_expr E
H2 : is_expr Msg
SN : exprNames Ctx' E []
SN1 : exprNames Ctx' Msg []
H3 : evalExpr FE (Scope::EE_B) E trueVal EE_B' O
============================
 exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_scopes_same,
         exactEval:host:evalExpr_scopes_same_ctx,
         exactEval:host:evalStmt_scopes_same,
         exactEval:host:evalStmt_scopes_same_ctx,
         exactEval:host:evalArgs_scopes_same,
         exactEval:host:evalArgs_scopes_same_ctx,
         exactEval:host:evalRecFields_scopes_same,
         exactEval:host:evalRecFields_scopes_same_ctx.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
============================
 OA = OB
 < case IsS.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
H1 : is_expr E
H2 : is_expr Msg
============================
 OA = OB
 < EvB: case EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE EE_B E trueVal EE_B' OB
============================
 OA = OB
 < apply IH_E to _ _ _ _ SS EvA1 EvB.

Subgoal 3.15:

Variables: FE EE_A EE_A' EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OB @
EvA1 : evalExpr FE EE_A E trueVal EE_A' OB *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE EE_B E trueVal EE_B' OB
============================
 OB = OB
 < search.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
============================
 scopes_same EE_A' EE_B'
 < case IsS.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
H1 : is_expr E
H2 : is_expr Msg
============================
 scopes_same EE_A' EE_B'
 < EvB: case EvB.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE EE_B E trueVal EE_B' OB
============================
 scopes_same EE_A' EE_B'
 < apply IH_E_C to _ _ _ _ _ EvA1 EvB.

Subgoal 4.15:

Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E
IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
         OA = OB
IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB,
           is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
         VA = VB /\ OA = OB
IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
           is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
           scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB ->
           scopes_same EE_A' EE_B'
IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
          VA = VB /\ OA = OB
IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
            scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB ->
            scopes_same EE_A' EE_B'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @
EvA1 : evalExpr FE EE_A E trueVal EE_A' OA *
H1 : is_expr E
H2 : is_expr Msg
EvB : evalExpr FE EE_B E trueVal EE_B' OB
H3 : scopes_same EE_A' EE_B'
============================
 scopes_same EE_A' EE_B'
 < search.

Proof completed.
 < Prove exactEval:host:evalExpr_scopes_same_exists,
         exactEval:host:evalStmt_scopes_same_exists,
         exactEval:host:evalArgs_scopes_same_exists,
         exactEval:host:evalRecFields_scopes_same_exists.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B Msg E
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' O @
EvA1 : evalExpr FE EE_A E trueVal EE_A' O *
============================
 exists EE_B', evalStmt FE EE_B (assert E Msg) EE_B' O
 < case IsS.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B Msg E
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' O @
EvA1 : evalExpr FE EE_A E trueVal EE_A' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 exists EE_B', evalStmt FE EE_B (assert E Msg) EE_B' O
 < apply IH_E to _ _ _ _ SS EvA1.

Subgoal 2.15:

Variables: FE EE_A EE_A' O EE_B Msg E EE_B'
IH_E : forall E FE EE_A V EE_A' O EE_B,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B',
           evalExpr FE EE_B E V EE_B' O
IH_S : forall S FE EE_A EE_A' O EE_B,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B',
           evalStmt FE EE_B S EE_B' O
IH_A : forall A FE EE_A V EE_A' O EE_B,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
         scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B',
           evalArgs FE EE_B A V EE_B' O
IH_RF : forall RF FE EE_A V EE_A' O EE_B,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B ->
          scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B',
            evalRecFields FE EE_B RF V EE_B' O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsA : is_list (is_list (is_pair is_string is_value)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
SS : scopes_same EE_A EE_B
EvA : evalStmt FE EE_A (assert E Msg) EE_A' O @
EvA1 : evalExpr FE EE_A E trueVal EE_A' O *
H1 : is_expr E
H2 : is_expr Msg
H3 : evalExpr FE EE_B E trueVal EE_B' O
============================
 exists EE_B', evalStmt FE EE_B (assert E Msg) EE_B' O
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalExpr_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalExpr_backward.

Proof completed.
 < Theorem is_list_values_append_nil :
     forall L, is_list is_value L -> L ++ [] = L.

============================
 forall L, is_list is_value L -> L ++ [] = L
 < induction on 1.

IH : forall L, is_list is_value L * -> L ++ [] = L
============================
 forall L, is_list is_value L @ -> L ++ [] = L
 < intros IsL.

Variables: L
IH : forall L, is_list is_value L * -> L ++ [] = L
IsL : is_list is_value L @
============================
 L ++ [] = L
 < Is: case IsL.

Subgoal 1:

IH : forall L, is_list is_value L * -> L ++ [] = L
============================
 [] ++ [] = []
 < search.

Subgoal 2:

Variables: T H
IH : forall L, is_list is_value L * -> L ++ [] = L
Is : is_value H
Is1 : is_list is_value T *
============================
 H::T ++ [] = H::T
 < apply IH to Is1.

Subgoal 2:

Variables: T H
IH : forall L, is_list is_value L * -> L ++ [] = L
Is : is_value H
Is1 : is_list is_value T *
H1 : T ++ [] = T
============================
 H::T ++ [] = H::T
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalStmt_forward.

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O
============================
 exists EE'',
   evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\
   scopes_same EE' EE''
 < case IsS.

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O
H1 : is_expr E
H2 : is_expr Msg
============================
 exists EE'',
   evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\
   scopes_same EE' EE''
 < Ev: case Ev.

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
============================
 exists EE'',
   evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\
   scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'',
   evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\
   scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 exists EE'',
   evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\
   scopes_same EE' EE''
 < exists EE'.

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O /\
 scopes_same EE' EE'
 < split.

Subgoal 1:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O
 < unfold .

Subgoal 1:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 exists EE1 O1 Scope O2,
   evalExpr FE EE E trueVal EE1 O1 /\
   (evalStmt FE ([]::EE1) noop (Scope::EE') O2 /\ O1 ++ O2 = O)
 < exists EE',
   O,
   [],
   [].

Subgoal 1:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 evalExpr FE EE E trueVal EE' O /\
 (evalStmt FE ([]::EE') noop ([]::EE') [] /\ O ++ [] = O)
 < split.

Subgoal 1.1:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 evalExpr FE EE E trueVal EE' O
 < search.

Subgoal 1.2:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 evalStmt FE ([]::EE') noop ([]::EE') []
 < search.

Subgoal 1.3:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 O ++ [] = O
 < IsO: apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 1.3:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
IsO : is_list is_value O
============================
 O ++ [] = O
 < backchain is_list_values_append_nil.

Subgoal 2:

Variables: Names FE EE EE' O Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 scopes_same EE' EE'
 < search.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalStmt_backward.

Variables: Names FE EE EE' O Ctx Ctx' Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
Ev : evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < case IsS.

Variables: Names FE EE EE' O Ctx Ctx' Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
Ev : evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O
H1 : is_expr E
H2 : is_expr Msg
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < Ev: case Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE3 O2
Ev1 : evalStmt FE ([]::EE3) noop (Scope::EE') O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < case Ev1.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Msg E O2
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O2
Ev2 : O2 ++ [] = O
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < apply append_nil_right to Ev2.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
Ev2 : O ++ [] = O
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < IsEE': apply evalExpr_isCtx to _ _ _ Ev.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
Ev2 : O ++ [] = O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < apply scopes_same_reflexive to IsEE'.

Subgoal 1:

Variables: Names FE EE EE' O Ctx Ctx' Msg E
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E trueVal EE' O
Ev2 : O ++ [] = O
IsEE' : is_list (is_list (is_pair is_string is_value)) EE'
H3 : scopes_same EE' EE'
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < search.

Subgoal 2:

Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E falseVal EE3 O2
Ev1 : evalStmt FE ([]::EE3) (printVal (errorExpr Msg intTy)) (Scope::EE') O3
Ev2 : O2 ++ O3 = O
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < Ev': case Ev1.

Subgoal 2.1:

Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 I O1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E falseVal EE3 O2
Ev2 : O2 ++ O3 = O
Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) (intVal I) (Scope::EE') O1
Ev'1 : O1 ++ [intVal I] = O3
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < case Ev'.

Subgoal 2.2:

Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 O1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E falseVal EE3 O2
Ev2 : O2 ++ O3 = O
Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) trueVal (Scope::EE') O1
Ev'1 : O1 ++ [trueVal] = O3
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < case Ev'.

Subgoal 2.3:

Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 O1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E falseVal EE3 O2
Ev2 : O2 ++ O3 = O
Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) falseVal (Scope::EE') O1
Ev'1 : O1 ++ [falseVal] = O3
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < case Ev'.

Subgoal 2.4:

Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 S1 O1
Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
Names : names EE Names
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE Ctx
SN : stmtNames Ctx (assert E Msg) [] Ctx'
H1 : is_expr E
H2 : is_expr Msg
Ev : evalExpr FE EE E falseVal EE3 O2
Ev2 : O2 ++ O3 = O
Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) (stringVal S1) (Scope::EE') O1
Ev'1 : O1 ++ [stringVal S1] = O3
============================
 exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
 < case Ev'.

Proof completed.
 < Prove_Ext_Ind exactEval:host:evalExpr,
   exactEval:host:evalArgs,
   exactEval:host:evalRecFields,
   exactEval:host:evalStmt.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
IsS : is_stmt (assert E Msg)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < case IsS.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < apply ext_size_is_int_evalExpr to R2.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
Acc : acc N @
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < Acc: case Acc.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < L: apply lt_plus_one to R1 _.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < apply ext_size_pos_evalExpr to R2.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < A: apply Acc to _ L.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < apply IH to R2 A _ _ _.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < Names: apply names_exists to IsEE.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalStmt {P}> FE EE (assert E Msg) EE' O
 < unfold .

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 exists Names S_P EE_P O_P,
   <evalExpr {P}> FE EE E trueVal EE' O /\
   (names EE Names /\
   (Names |{stmt}- assert E Msg ~~> S_P /\ <evalStmt {P}> FE EE S_P EE_P O_P))
 < exists N1,
   ifThenElse E noop (printVal (errorExpr Msg intTy)),
   EE',
   O.

Subgoal 4.15:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalExpr {P}> FE EE E trueVal EE' O /\
 (names EE N1 /\
 (N1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) /\
 <evalStmt {P}> FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O))
 < split.

Subgoal 4.15.1:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalExpr {P}> FE EE E trueVal EE' O
 < search.

Subgoal 4.15.2:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 names EE N1
 < search.

Subgoal 4.15.3:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 N1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
 < search.

Subgoal 4.15.4:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalStmt {P}> FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O
 < unfold .

Subgoal 4.15.4:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 exists EE1 O1 Scope O2,
   <evalExpr {P}> FE EE E trueVal EE1 O1 /\
   (<evalStmt {P}> FE ([]::EE1) noop (Scope::EE') O2 /\ O1 ++ O2 = O)
 < exists EE',
   O,
   [],
   [].

Subgoal 4.15.4:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalExpr {P}> FE EE E trueVal EE' O /\
 (<evalStmt {P}> FE ([]::EE') noop ([]::EE') [] /\ O ++ [] = O)
 < split.

Subgoal 4.15.4.1:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalExpr {P}> FE EE E trueVal EE' O
 < search.

Subgoal 4.15.4.2:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 <evalStmt {P}> FE ([]::EE') noop ([]::EE') []
 < search.

Subgoal 4.15.4.3:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
============================
 O ++ [] = O
 < Ev: apply drop_ext_size_evalExpr to R2.

Subgoal 4.15.4.3:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
Ev : evalExpr FE EE E trueVal EE' O
============================
 O ++ [] = O
 < apply evalExpr_isOutput to _ _ _ Ev.

Subgoal 4.15.4.3:

Variables: N FE EE EE' O N2 Msg E N1
IH : forall N FE EE E V EE' O,
       <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
       is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH1 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH2 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH3 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
IH4 : forall N FE EE E V EE' O,
        <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O
IH5 : forall N FE EE A V EE' O,
        <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O
IH6 : forall N FE EE RF V EE' O,
        <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF ->
        <evalRecFields {P}> FE EE RF V EE' O
IH7 : forall N FE EE S EE' O,
        <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
        is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O
R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 **
H1 : is_expr E
H2 : is_expr Msg
H3 : is_integer N2
Acc : forall M, 0 <= M -> M < N -> acc M *
L : N2 < N
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E trueVal EE' O
Names : names EE N1
Ev : evalExpr FE EE E trueVal EE' O
H6 : is_list is_value O
============================
 O ++ [] = O
 < backchain is_list_values_append_nil.

Proof completed.
 < Prove exactEval:host:paramName_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_paramName_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_paramName_back.

Proof completed.
 < Prove exactEval:host:getFunEvalInfo_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_getFunEvalInfo_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_getFunEvalInfo_back.

Proof completed.
 < Prove exactEval:host:evalProgram_unique.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalProgram_forward.

Proof completed.
 < Prove_Constraint exactEval:host:proj_evalProgram_back.

Proof completed.
 < Prove exactEval:host:evalExpr_typePres_ctx,
         exactEval:host:evalExpr_typePres,
         exactEval:host:evalStmt_typePres,
         exactEval:host:evalArgs_typePres_Ctx,
         exactEval:host:evalArgs_typePres,
         exactEval:host:evalRecFields_typePres_Ctx,
         exactEval:host:evalRecFields_typePres.

Subgoal 3.15:

Variables: FT ET ET' FE EE EE' O Msg E
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IsS : is_stmt (assert E Msg)
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ET (assert E Msg) ET'
Ev : evalStmt FE EE (assert E Msg) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E trueVal EE' O *
============================
 related_all_scopes ET' EE'
 < case IsS.

Subgoal 3.15:

Variables: FT ET ET' FE EE EE' O Msg E
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ty : stmtOK FT ET (assert E Msg) ET'
Ev : evalStmt FE EE (assert E Msg) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET EE
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 related_all_scopes ET' EE'
 < Ty: case Ty.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O Msg E
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
Ty : typeOf FT ET' E boolTy
Ty1 : typeOf FT ET' Msg stringTy
============================
 related_all_scopes ET' EE'
 < apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _.

Subgoal 3.15:

Variables: FT ET' FE EE EE' O Msg E
IH_C_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_E : forall E FT ET Ty FE EE EE' O V,
           is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty ->
           evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueType V Ty
IH_C_S : forall S FT ET ET' FE EE EE' O,
           is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' ->
           evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET' EE'
IH_C_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           related_all_scopes ET EE'
IH_T_A : forall A FT ET Tys FE EE EE' O Vs,
           is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
           is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
           is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys ->
           evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
             lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
             exists Scope TyEnv',
               (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
               stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
           valueTypeList Vs Tys
IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            related_all_scopes ET EE'
IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs,
            is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT ->
            is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
            is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys ->
            evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal,
              lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
              exists Scope TyEnv',
                (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
                stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE ->
            valFieldTys FVs FTys
IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT
IsET : is_list (is_list (is_pair is_string is_typ)) ET'
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal,
         lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) ->
         exists Scope TyEnv',
           (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\
           stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv'
Ctxs : related_all_scopes ET' EE
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
Ty : typeOf FT ET' E boolTy
Ty1 : typeOf FT ET' Msg stringTy
H3 : related_all_scopes ET' EE'
============================
 related_all_scopes ET' EE'
 < search.

Proof completed.
 < Prove exactEval:host:paramTy_paramName_same.

Proof completed.
 < Prove exactEval:host:funOK_getFunEvalInfo_related.

Proof completed.
 < Prove exactEval:host:evalExpr_output_forms,
         exactEval:host:evalStmt_output_forms,
         exactEval:host:evalArgs_output_forms,
         exactEval:host:evalRecFields_output_forms.

Subgoal 2.15:

Variables: FE EE EE' O Msg E
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IsS : is_stmt (assert E Msg)
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
============================
 output_forms O
 < case IsS.

Subgoal 2.15:

Variables: FE EE EE' O Msg E
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
============================
 output_forms O
 < apply IH_E to _ _ _ Ev1.

Subgoal 2.15:

Variables: FE EE EE' O Msg E
IH_E : forall E FE EE V EE' O,
         is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * ->
         output_forms O
IH_S : forall S FE EE EE' O,
         is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * ->
         output_forms O
IH_A : forall A FE EE Vs EE' O,
         is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
         is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * ->
         output_forms O
IH_RF : forall RF FE EE Fields EE' O,
          is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE ->
          is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * ->
          output_forms O
IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE
IsEE : is_list (is_list (is_pair is_string is_value)) EE
Ev : evalStmt FE EE (assert E Msg) EE' O @
Ev1 : evalExpr FE EE E trueVal EE' O *
H1 : is_expr E
H2 : is_expr Msg
H3 : output_forms O
============================
 output_forms O
 < search.

Proof completed.
 < Prove exactEval:host:evalProgram_output_forms.

Proof completed.
 < Prove exactEval:host:paramName_exists.

Proof completed.
 < Prove exactEval:host:getFunEvalInfo_exists.

Proof completed.
Back to example home