< Module exactEval:ascription.
< Prove_Constraint exactEval:host:proj_expr_unique.
Variables: L1 L2 E1 E2 Ty
PrA : L1 |{expr}- ascribe E1 Ty ~~> E1
PrB : L2 |{expr}- ascribe E1 Ty ~~> E2
IsE : is_expr (ascribe E1 Ty)
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
============================
E1 = E2
< case PrB.
Variables: L1 L2 E2 Ty
PrA : L1 |{expr}- ascribe E2 Ty ~~> E2
IsE : is_expr (ascribe E2 Ty)
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
============================
E2 = E2
< search.
Proof completed.
< Prove_Constraint exactEval:host:proj_expr_is.
Variables: L E' Ty
Pr : L |{expr}- ascribe E' Ty ~~> E'
IsE : is_expr (ascribe E' Ty)
IsL : is_list is_string L
============================
is_expr E'
< case IsE.
Variables: L E' Ty
Pr : L |{expr}- ascribe E' Ty ~~> E'
IsL : is_list is_string L
H1 : is_expr E'
H2 : is_typ Ty
============================
is_expr E'
< search.
Proof completed.
< Prove_Constraint exactEval:host:proj_expr_other.
Variables: L E' L' Ty
Pr : L |{expr}- ascribe E' Ty ~~> E'
IsE : is_expr (ascribe E' Ty)
IsL : is_list is_string L
IsL' : is_list is_string L'
============================
exists E'', L' |{expr}- ascribe E' Ty ~~> E''
< search.
Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_unique.
Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_is.
Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_other.
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 1.21:
Variables: Typ Expr
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_expr (ascribe Expr Typ) @
R1 : is_expr Expr *
R2 : is_typ Typ
============================
<is_expr {P}> (ascribe Expr Typ)
< apply IH to R1.
Subgoal 1.21:
Variables: Typ Expr
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_expr (ascribe Expr Typ) @
R1 : is_expr Expr *
R2 : is_typ Typ
H1 : <is_expr {P}> Expr
============================
<is_expr {P}> (ascribe Expr Typ)
< 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.
Subgoal 1.21:
Variables: V1 V2 Ty E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
IsE : is_expr (ascribe E1 Ty)
VarsA : vars (ascribe E1 Ty) V1 @
VarsB : vars (ascribe E1 Ty) V2
VarsA1 : vars E1 V1 *
============================
V1 = V2
< case IsE.
Subgoal 1.21:
Variables: V1 V2 Ty E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (ascribe E1 Ty) V1 @
VarsB : vars (ascribe E1 Ty) V2
VarsA1 : vars E1 V1 *
H1 : is_expr E1
H2 : is_typ Ty
============================
V1 = V2
< VarsB: case VarsB.
Subgoal 1.21:
Variables: V1 V2 Ty E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (ascribe E1 Ty) V1 @
VarsA1 : vars E1 V1 *
H1 : is_expr E1
H2 : is_typ Ty
VarsB : vars E1 V2
============================
V1 = V2
< apply IH to _ VarsA1 VarsB.
Subgoal 1.21:
Variables: V2 Ty E1
IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2
IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2
IH2 : forall RF V1 V2,
is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2
VarsA : vars (ascribe E1 Ty) V2 @
VarsA1 : vars E1 V2 *
H1 : is_expr E1
H2 : is_typ Ty
VarsB : vars E1 V2
============================
V2 = V2
< search.
Proof completed.
< Prove exactEval:host:vars_is.
Subgoal 1.21:
Variables: V Ty E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
IsE : is_expr (ascribe E1 Ty)
V : vars (ascribe E1 Ty) V @
V1 : vars E1 V *
============================
is_list is_string V
< case IsE.
Subgoal 1.21:
Variables: V Ty E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (ascribe E1 Ty) V @
V1 : vars E1 V *
H1 : is_expr E1
H2 : is_typ Ty
============================
is_list is_string V
< apply IH to _ V1.
Subgoal 1.21:
Variables: V Ty E1
IH : forall E V, is_expr E -> vars E V * -> is_list is_string V
IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V
IH2 : forall RF V,
is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V
V : vars (ascribe E1 Ty) V @
V1 : vars E1 V *
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_list is_string V
============================
is_list is_string V
< search.
Proof completed.
< Prove exactEval:host:vars_exist,
exactEval:host:varsArgs_exist,
exactEval:host:varsRecFields_exist.
Subgoal 1.21:
Variables: Typ Expr
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (ascribe Expr Typ) @
IsE1 : is_expr Expr *
IsE2 : is_typ Typ
============================
exists V, vars (ascribe Expr Typ) V
< apply IH to IsE1.
Subgoal 1.21:
Variables: Typ Expr V
IH : forall E, is_expr E * -> exists V, vars E V
IH1 : forall A, is_args A * -> exists V, varsArgs A V
IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V
IsE : is_expr (ascribe Expr Typ) @
IsE1 : is_expr Expr *
IsE2 : is_typ Typ
H1 : vars Expr V
============================
exists V, vars (ascribe Expr Typ) V
< search.
Proof completed.
< Prove exactEval:host:stmtNames_is,
exactEval:host:stmtNames_isCtx,
exactEval:host:exprNames_is.
Subgoal 3.22:
Variables: Ctx N Ty E1
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
IsE : is_expr (ascribe E1 Ty)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (ascribe E1 Ty) N @
EN1 : exprNames Ctx E1 N *
============================
is_list is_string N
< case IsE.
Subgoal 3.22:
Variables: Ctx N Ty E1
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
EN : exprNames Ctx (ascribe E1 Ty) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_typ Ty
============================
is_list is_string N
< apply IH_E to _ _ EN1.
Subgoal 3.22:
Variables: Ctx N Ty E1
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
EN : exprNames Ctx (ascribe E1 Ty) N @
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_list is_string N
============================
is_list is_string N
< search.
Proof completed.
< Prove exactEval:host:stmtNames_unique,
exactEval:host:exprNames_unique.
Subgoal 2.22:
Variables: Ctx NA NB Ty E1
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
IsE : is_expr (ascribe E1 Ty)
IsCtx : is_list (is_list is_string) Ctx
ENA : exprNames Ctx (ascribe E1 Ty) NA @
ENB : exprNames Ctx (ascribe E1 Ty) NB
ENA1 : exprNames Ctx E1 NA *
============================
NA = NB
< case IsE.
Subgoal 2.22:
Variables: Ctx NA NB Ty E1
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) Ctx
ENA : exprNames Ctx (ascribe E1 Ty) NA @
ENB : exprNames Ctx (ascribe E1 Ty) NB
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
H2 : is_typ Ty
============================
NA = NB
< ENB: case ENB.
Subgoal 2.22:
Variables: Ctx NA NB Ty E1
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) Ctx
ENA : exprNames Ctx (ascribe E1 Ty) NA @
ENA1 : exprNames Ctx E1 NA *
H1 : is_expr E1
H2 : is_typ Ty
ENB : exprNames Ctx E1 NB
============================
NA = NB
< apply IH_E to _ _ ENA1 ENB.
Subgoal 2.22:
Variables: Ctx NB Ty E1
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) Ctx
ENA : exprNames Ctx (ascribe E1 Ty) NB @
ENA1 : exprNames Ctx E1 NB *
H1 : is_expr E1
H2 : is_typ Ty
ENB : exprNames Ctx E1 NB
============================
NB = NB
< search.
Proof completed.
< Prove exactEval:host:stmtNames_keep_older.
Proof completed.
< Prove exactEval:host:stmtNames_exists,
exactEval:host:exprNames_exists,
exactEval:host:argsNames_exists,
exactEval:host:recFieldNames_exists.
Subgoal 2.21:
Variables: Ctx Typ Expr
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
IsE : is_expr (ascribe Expr Typ) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
IsE2 : is_typ Typ
============================
exists N, exprNames Ctx (ascribe Expr Typ) N
< apply IH_E to IsE1 IsCtx.
Subgoal 2.21:
Variables: Ctx Typ Expr 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
IsE : is_expr (ascribe Expr Typ) @
IsCtx : is_list (is_list is_string) Ctx
IsE1 : is_expr Expr *
IsE2 : is_typ Typ
H1 : exprNames Ctx Expr N
============================
exists N, exprNames Ctx (ascribe Expr Typ) N
< search.
Proof completed.
< Prove exactEval:host:stmtNames_not_in_ctx,
exactEval:host:exprNames_not_in_ctx.
Subgoal 2.22:
Variables: Ctx N X Ty E1
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
IsE : is_expr (ascribe E1 Ty)
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (ascribe E1 Ty) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
============================
false
< case IsE.
Subgoal 2.22:
Variables: Ctx N X Ty E1
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) Ctx
EN : exprNames Ctx (ascribe E1 Ty) N @
MemN : mem X N
MemsCtx : mems X Ctx
EN1 : exprNames Ctx E1 N *
H1 : is_expr E1
H2 : is_typ Ty
============================
false
< apply IH_E to _ _ EN1 MemN 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 4.22:
Variables: CtxA CtxB N Ty E1
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
IsE : is_expr (ascribe E1 Ty)
IsCtxA : is_list (is_list is_string) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (ascribe E1 Ty) N @
EN1 : exprNames CtxA E1 N *
============================
exprNames CtxB (ascribe E1 Ty) N
< case IsE.
Subgoal 4.22:
Variables: CtxA CtxB N Ty E1
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 X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (ascribe E1 Ty) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
H2 : is_typ Ty
============================
exprNames CtxB (ascribe E1 Ty) N
< apply IH_E to _ _ _ _ _ EN1.
Subgoal 4.22:
Variables: CtxA CtxB N Ty E1
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 X, mems X CtxA -> mems X CtxB
RelBA : forall X, mems X CtxB -> mems X CtxA
EN : exprNames CtxA (ascribe E1 Ty) N @
EN1 : exprNames CtxA E1 N *
H1 : is_expr E1
H2 : is_typ Ty
H3 : exprNames CtxB E1 N
============================
exprNames CtxB (ascribe E1 Ty) N
< search.
Proof completed.
< Prove exactEval:host:stmtNames_increaseCtxs,
exactEval:host:stmtNames_increaseCtxs_ctxs,
exactEval:host:exprNames_increaseCtxs.
Subgoal 3.22:
Variables: CtxA NA CtxB NB X Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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
ENA : exprNames CtxA (ascribe E1 Ty) NA @
ENB : exprNames CtxB (ascribe E1 Ty) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
============================
mem X NA
< case IsE.
Subgoal 3.22:
Variables: CtxA NA CtxB NB X Ty E1
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) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (ascribe E1 Ty) NA @
ENB : exprNames CtxB (ascribe E1 Ty) NB
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
H2 : is_typ Ty
============================
mem X NA
< ENB: case ENB.
Subgoal 3.22:
Variables: CtxA NA CtxB NB X Ty E1
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) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (ascribe E1 Ty) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
H2 : is_typ Ty
ENB : exprNames CtxB E1 NB
============================
mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M.
Subgoal 3.22:
Variables: CtxA NA CtxB NB X Ty E1
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) CtxA
IsCtxB : is_list (is_list is_string) CtxB
RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB
ENA : exprNames CtxA (ascribe E1 Ty) NA @
M : mem X NB
ENA1 : exprNames CtxA E1 NA *
H1 : is_expr E1
H2 : is_typ Ty
ENB : exprNames CtxB E1 NB
H3 : mem X NA
============================
mem X NA
< search.
Proof completed.
< Prove_Constraint exactEval:host:proj_exprNames.
Variables: Names E_P Ctx N N_P X Ty
Pr : Names |{expr}- ascribe E_P Ty ~~> E_P
IsE : is_expr (ascribe E_P Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN : exprNames Ctx (ascribe E_P Ty) N
EN_P : exprNames Ctx E_P N_P
M : mem X N_P
============================
mem X N
< EN: case EN.
Variables: Names E_P Ctx N N_P X Ty
Pr : Names |{expr}- ascribe E_P Ty ~~> E_P
IsE : is_expr (ascribe E_P Ty)
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx E_P N_P
M : mem X N_P
EN : exprNames Ctx E_P N
============================
mem X N
< case IsE.
Variables: Names E_P Ctx N N_P X Ty
Pr : Names |{expr}- ascribe E_P Ty ~~> E_P
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx E_P N_P
M : mem X N_P
EN : exprNames Ctx E_P N
H1 : is_expr E_P
H2 : is_typ Ty
============================
mem X N
< apply exprNames_unique to _ _ EN_P EN.
Variables: Names E_P Ctx N X Ty
Pr : Names |{expr}- ascribe E_P Ty ~~> E_P
IsNames : is_list is_string Names
IsCtx : is_list (is_list is_string) Ctx
EN_P : exprNames Ctx E_P N
M : mem X N
EN : exprNames Ctx E_P N
H1 : is_expr E_P
H2 : is_typ Ty
============================
mem X N
< search.
Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames.
Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_forward.
Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_backward.
Proof completed.
< Prove exactEval:host:typeOf_isTy,
exactEval:host:stmtOK_isCtx.
Subgoal 1.23:
Variables: FT ET Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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 : typeOf FT ET (ascribe E1 Ty) Ty @
Ty1 : typeOf FT ET E1 Ty *
============================
is_typ Ty
< case IsE.
Subgoal 1.23:
Variables: FT ET Ty E1
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
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 : typeOf FT ET (ascribe E1 Ty) Ty @
Ty1 : typeOf FT ET E1 Ty *
H1 : is_expr E1
H2 : is_typ Ty
============================
is_typ Ty
< apply IH to _ _ _ Ty1.
Subgoal 1.23:
Variables: FT ET Ty E1
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
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 : typeOf FT ET (ascribe E1 Ty) Ty @
Ty1 : typeOf FT ET E1 Ty *
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_typ Ty
============================
is_typ Ty
< search.
Proof completed.
< Prove exactEval:host:stmtOK_keep_scopes.
Proof completed.
< Prove exactEval:host:stmtOK_older_scopes_same.
Proof completed.
< Prove exactEval:host:stmtOK_first_scope_lookup_same.
Proof completed.
< Prove exactEval:host:typeOf_unique,
exactEval:host:stmtOK_unique.
Subgoal 1.23:
Variables: FT ET_A ET_B TyA TyB E1
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
IsE : is_expr (ascribe E1 TyA)
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 : typeOf FT ET_A (ascribe E1 TyA) TyA @
TyB : typeOf FT ET_B (ascribe E1 TyA) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 TyA *
============================
TyA = TyB
< case IsE.
Subgoal 1.23:
Variables: FT ET_A ET_B TyA TyB E1
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
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 : typeOf FT ET_A (ascribe E1 TyA) TyA @
TyB : typeOf FT ET_B (ascribe E1 TyA) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 TyA *
H1 : is_expr E1
H2 : is_typ TyA
============================
TyA = TyB
< TyB: case TyB.
Subgoal 1.23:
Variables: FT ET_A ET_B TyB E1
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
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 : typeOf FT ET_A (ascribe E1 TyB) TyB @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 TyB *
H1 : is_expr E1
H2 : is_typ TyB
TyB : typeOf FT ET_B E1 TyB
============================
TyB = TyB
< apply IH_E to _ _ _ _ TyA1 TyB _.
Subgoal 1.23:
Variables: FT ET_A ET_B TyB E1
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
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 : typeOf FT ET_A (ascribe E1 TyB) TyB @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A E1 TyB *
H1 : is_expr E1
H2 : is_typ TyB
TyB : typeOf FT ET_B E1 TyB
============================
TyB = TyB
< 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 1.27:
Variables: FE EE EE' V O Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
============================
is_list (is_list (is_pair is_string is_value)) EE'
< case IsE.
Subgoal 1.27:
Variables: FE EE EE' V O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1.
Subgoal 1.27:
Variables: FE EE EE' V O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_list (is_list (is_pair is_string is_value)) EE'
============================
is_list (is_list (is_pair is_string is_value)) EE'
< search.
Subgoal 2.27:
Variables: FE EE EE' V O Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
============================
is_value V
< case IsE.
Subgoal 2.27:
Variables: FE EE EE' V O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
is_value V
< apply IH_V_E to _ _ _ Ev1.
Subgoal 2.27:
Variables: FE EE EE' V O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_value V
============================
is_value V
< search.
Proof completed.
< Prove exactEval:host:evalExpr_isOutput,
exactEval:host:evalStmt_isOutput,
exactEval:host:evalArgs_isOutput,
exactEval:host:evalRecFields_isOutput.
Subgoal 1.27:
Variables: FE EE EE' V O Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
============================
is_list is_value O
< case IsE.
Subgoal 1.27:
Variables: FE EE EE' V O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
is_list is_value O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.27:
Variables: FE EE EE' V O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
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 1.27:
Variables: FE EE V EE' O Ty E1
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'
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
============================
names_same EE EE'
< case IsE.
Subgoal 1.27:
Variables: FE EE V EE' O Ty E1
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)) EE
Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
names_same EE EE'
< apply IH_E to _ _ _ Ev1.
Subgoal 1.27:
Variables: FE EE V EE' O Ty E1
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)) EE
Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
H3 : names_same EE 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 1.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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'
IsE : is_expr (ascribe E1 Ty)
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
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
============================
VA = VB
< case IsE.
Subgoal 1.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
============================
VA = VB
< EvB: case EvB.
Subgoal 1.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' O_B
============================
VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _.
Subgoal 1.27:
Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VB EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VB EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' O_B
============================
VB = VB
< search.
Subgoal 2.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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'
IsE : is_expr (ascribe E1 Ty)
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
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
============================
O_A = O_B
< case IsE.
Subgoal 2.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
============================
O_A = O_B
< EvB: case EvB.
Subgoal 2.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' O_B
============================
O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _.
Subgoal 2.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_B @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_B *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' O_B
============================
O_B = O_B
< search.
Subgoal 3.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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'
IsE : is_expr (ascribe E1 Ty)
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
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
============================
newNameScopes N Len EE_A' EE_B'
< case IsE.
Subgoal 3.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
============================
newNameScopes N Len EE_A' EE_B'
< EvB: case EvB.
Subgoal 3.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' O_B
============================
newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _.
Subgoal 3.27:
Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB 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:evalStmt,
exactEval:host:evalArgs,
exactEval:host:evalRecFields.
Proof completed.
< Add_Proj_Rel exactEval:host:evalExpr,
exactEval:host:evalStmt,
exactEval:host:evalArgs,
exactEval:host:evalRecFields.
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 1.27:
Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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
EvB : <evalExpr {ES}> FE EE_B (ascribe E1 Ty) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V EE_B' O N2 *
============================
exists EE_A', <evalExpr {ES}> FE EE_A (ascribe E1 Ty) V EE_A' O ES
< case IsE.
Subgoal 1.27:
Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (ascribe E1 Ty) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V EE_B' O N2 *
H1 : is_expr E1
H2 : is_typ Ty
============================
exists EE_A', <evalExpr {ES}> FE EE_A (ascribe E1 Ty) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 NNS.
Subgoal 1.27:
Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Ty E1 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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
EvB : <evalExpr {ES}> FE EE_B (ascribe E1 Ty) V EE_B' O ES @
NNS : newNameScopes N Len EE_A EE_B
EvB1 : 1 + N2 = ES
EvB2 : <evalExpr {ES}> FE EE_B E1 V EE_B' O N2 *
H1 : is_expr E1
H2 : is_typ Ty
H3 : <evalExpr {ES}> FE EE_A E1 V EE_A' O N2
============================
exists EE_A', <evalExpr {ES}> FE EE_A (ascribe E1 Ty) V 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 1.27:
Variables: FE EE V EE' O Ctx N Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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
EN : exprNames Ctx (ascribe E1 Ty) N
Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
============================
ctx_names EE' Ctx
< case IsE.
Subgoal 1.27:
Variables: FE EE V EE' O Ctx N Ty E1
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
EN : exprNames Ctx (ascribe E1 Ty) N
Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
ctx_names EE' Ctx
< EN: case EN.
Subgoal 1.27:
Variables: FE EE V EE' O Ctx N Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
EN : exprNames Ctx E1 N
============================
ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1.
Subgoal 1.27:
Variables: FE EE V EE' O Ctx N Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
EN : exprNames Ctx E1 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 1.27:
Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (ascribe E1 Ty) []
EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< case IsE.
Subgoal 1.27:
Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EN : exprNames Ctx (ascribe E1 Ty) []
EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< EN: case EN.
Subgoal 1.27:
Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1
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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
H1 : is_expr E1
H2 : is_typ Ty
EN : exprNames Ctx E1 []
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS.
Subgoal 1.27:
Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1 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)) EE_A
IsB : is_list (is_list (is_pair is_string is_value)) EE_B
IsCtx : is_list (is_list is_string) Ctx
Ctxs : ctx_names EE_B Ctx
EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
NNS : newNameScopes N Len EE_A EE_B
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
H1 : is_expr E1
H2 : is_typ Ty
EN : exprNames Ctx E1 []
H3 : evalExpr FE EE_B E1 V EE_B' O
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V 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 1.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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'
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
============================
VA = VB /\ OA = OB
< case IsE.
Subgoal 1.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
H1 : is_expr E1
H2 : is_typ Ty
============================
VA = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.27:
Variables: FE EE_A EE_A' EE_B VB EE_B' OB Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) VB EE_A' OB @
EvA1 : evalExpr FE EE_A E1 VB EE_A' OB *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' OB
============================
VB = VB /\ OB = OB
< search.
Subgoal 2.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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'
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
============================
scopes_same EE_A' EE_B'
< case IsE.
Subgoal 2.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
H1 : is_expr E1
H2 : is_typ Ty
============================
scopes_same EE_A' EE_B'
< EvB: case EvB.
Subgoal 2.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB EE_B' OB
============================
scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ SS EvA1 EvB.
Subgoal 2.27:
Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @
EvA1 : evalExpr FE EE_A E1 VA EE_A' OA *
H1 : is_expr E1
H2 : is_typ Ty
EvB : evalExpr FE EE_B E1 VB 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 1.27:
Variables: FE EE_A V EE_A' O EE_B Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< case IsE.
Subgoal 1.27:
Variables: FE EE_A V EE_A' O EE_B Ty E1
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 : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.27:
Variables: FE EE_A V EE_A' O EE_B Ty E1 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 : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @
EvA1 : evalExpr FE EE_A E1 V EE_A' O *
H1 : is_expr E1
H2 : is_typ Ty
H3 : evalExpr FE EE_B E1 V EE_B' O
============================
exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< search.
Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_forward.
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
Names : names EE Names
IsE : is_expr (ascribe E' Ty)
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 : evalExpr FE EE (ascribe E' Ty) V EE' O
============================
exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''
< case IsE.
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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 : evalExpr FE EE (ascribe E' Ty) V EE' O
H1 : is_expr E'
H2 : is_typ Ty
============================
exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev.
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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_typ Ty
Ev : evalExpr FE EE E' V EE' O
============================
exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''
< exists EE'.
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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_typ Ty
Ev : evalExpr FE EE E' V EE' O
============================
evalExpr FE EE E' V EE' O /\ scopes_same EE' EE'
< split.
Subgoal 1:
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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_typ Ty
Ev : evalExpr FE EE E' V EE' O
============================
evalExpr FE EE E' V EE' O
< search.
Subgoal 2:
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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_typ Ty
Ev : evalExpr FE EE E' V EE' O
============================
scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ Ev.
Subgoal 2:
Variables: Names E' FE EE V EE' O Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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_typ Ty
Ev : evalExpr FE EE E' V EE' O
H3 : is_list (is_list (is_pair is_string is_value)) EE'
============================
scopes_same EE' EE'
< backchain scopes_same_reflexive.
Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_backward.
Variables: Names E' FE EE V EE' O Ctx Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
Names : names EE Names
IsE : is_expr (ascribe E' Ty)
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
EN : exprNames Ctx (ascribe E' Ty) []
Ev : evalExpr FE EE E' V EE' O
============================
exists EE'', evalExpr FE EE (ascribe E' Ty) V EE'' O /\ scopes_same EE' EE''
< case IsE.
Variables: Names E' FE EE V EE' O Ctx Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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
EN : exprNames Ctx (ascribe E' Ty) []
Ev : evalExpr FE EE E' V EE' O
H1 : is_expr E'
H2 : is_typ Ty
============================
exists EE'', evalExpr FE EE (ascribe E' Ty) V EE'' O /\ scopes_same EE' EE''
< exists EE'.
Variables: Names E' FE EE V EE' O Ctx Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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
EN : exprNames Ctx (ascribe E' Ty) []
Ev : evalExpr FE EE E' V EE' O
H1 : is_expr E'
H2 : is_typ Ty
============================
evalExpr FE EE (ascribe E' Ty) V EE' O /\ scopes_same EE' EE'
< split.
Subgoal 1:
Variables: Names E' FE EE V EE' O Ctx Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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
EN : exprNames Ctx (ascribe E' Ty) []
Ev : evalExpr FE EE E' V EE' O
H1 : is_expr E'
H2 : is_typ Ty
============================
evalExpr FE EE (ascribe E' Ty) V EE' O
< search.
Subgoal 2:
Variables: Names E' FE EE V EE' O Ctx Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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
EN : exprNames Ctx (ascribe E' Ty) []
Ev : evalExpr FE EE E' V EE' O
H1 : is_expr E'
H2 : is_typ Ty
============================
scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ Ev.
Subgoal 2:
Variables: Names E' FE EE V EE' O Ctx Ty
Pr : Names |{expr}- ascribe E' Ty ~~> E'
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
EN : exprNames Ctx (ascribe E' Ty) []
Ev : evalExpr FE EE E' V EE' O
H1 : is_expr E'
H2 : is_typ Ty
H3 : is_list (is_list (is_pair is_string is_value)) EE'
============================
scopes_same EE' EE'
< backchain scopes_same_reflexive.
Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_forward.
Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_backward.
Proof completed.
< Prove_Ext_Ind exactEval:host:evalExpr,
exactEval:host:evalArgs,
exactEval:host:evalRecFields,
exactEval:host:evalStmt.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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
IsE : is_expr (ascribe E1 Ty)
R1 : 1 + N2 = N
R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 **
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< case IsE.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< apply ext_size_is_int_evalExpr to R2.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< L: apply lt_plus_one to R1 _.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
L : N2 < N
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< Acc: case Acc.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
L : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< apply ext_size_pos_evalExpr to R2.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
L : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N2
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< A: apply Acc to _ L.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
L : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N2
A : acc N2 *
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< apply IH to R2 A _ _ _.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1
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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
L : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 V EE' O
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< Names: apply names_exists to IsEE.
Subgoal 1.27:
Variables: N FE EE V EE' O N2 Ty E1 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 : <evalExpr {ES}> FE EE (ascribe E1 Ty) V 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 E1 V EE' O N2 **
H1 : is_expr E1
H2 : is_typ Ty
H3 : is_integer N2
L : N2 < N
Acc : forall M, 0 <= M -> M < N -> acc M *
H4 : 0 <= N2
A : acc N2 *
H5 : <evalExpr {P}> FE EE E1 V EE' O
Names : names EE N1
============================
<evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< search.
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 1.27:
Variables: FT ET Ty FE EE EE' O V Ty1 E1
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
IsE : is_expr (ascribe E1 Ty1)
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 : typeOf FT ET (ascribe E1 Ty1) Ty
Ev : evalExpr FE EE (ascribe E1 Ty1) V 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 E1 V EE' O *
============================
related_all_scopes ET EE'
< case IsE.
Subgoal 1.27:
Variables: FT ET Ty FE EE EE' O V Ty1 E1
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 : typeOf FT ET (ascribe E1 Ty1) Ty
Ev : evalExpr FE EE (ascribe E1 Ty1) V 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 E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty1
============================
related_all_scopes ET EE'
< Ty: case Ty.
Subgoal 1.27:
Variables: FT ET Ty FE EE EE' O V E1
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 : evalExpr FE EE (ascribe E1 Ty) V 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 E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
Ty : typeOf FT ET E1 Ty
============================
related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 1.27:
Variables: FT ET Ty FE EE EE' O V E1
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 : evalExpr FE EE (ascribe E1 Ty) V 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 E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
Ty : typeOf FT ET E1 Ty
H3 : related_all_scopes ET EE'
============================
related_all_scopes ET EE'
< search.
Subgoal 2.27:
Variables: FT ET Ty FE EE EE' O V Ty1 E1
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
IsE : is_expr (ascribe E1 Ty1)
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 : typeOf FT ET (ascribe E1 Ty1) Ty
Ev : evalExpr FE EE (ascribe E1 Ty1) V 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 E1 V EE' O *
============================
valueType V Ty
< case IsE.
Subgoal 2.27:
Variables: FT ET Ty FE EE EE' O V Ty1 E1
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 : typeOf FT ET (ascribe E1 Ty1) Ty
Ev : evalExpr FE EE (ascribe E1 Ty1) V 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 E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty1
============================
valueType V Ty
< Ty: case Ty.
Subgoal 2.27:
Variables: FT ET Ty FE EE EE' O V E1
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 : evalExpr FE EE (ascribe E1 Ty) V 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 E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
Ty : typeOf FT ET E1 Ty
============================
valueType V Ty
< apply IH_T_E to _ _ _ _ _ Ty Ev1 _ _.
Subgoal 2.27:
Variables: FT ET Ty FE EE EE' O V E1
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 : evalExpr FE EE (ascribe E1 Ty) V 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 E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
Ty : typeOf FT ET E1 Ty
H3 : valueType V Ty
============================
valueType V Ty
< 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 1.27:
Variables: FE EE V EE' O Ty E1
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
IsE : is_expr (ascribe E1 Ty)
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
============================
output_forms O
< case IsE.
Subgoal 1.27:
Variables: FE EE V EE' O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.27:
Variables: FE EE V EE' O Ty E1
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 : evalExpr FE EE (ascribe E1 Ty) V EE' O @
Ev1 : evalExpr FE EE E1 V EE' O *
H1 : is_expr E1
H2 : is_typ Ty
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.