< Module looseEval:condExpr.
< Prove_Constraint looseEval:host:proj_expr_unique.
Variables: E2 F T C
PrA : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
PrB : |{expr}- condExpr C T F ~~> E2
IsE : is_expr (condExpr C T F)
============================
or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0)) = E2
< case PrB.
Variables: F T C
PrA : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
============================
or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0)) = or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
< search.
Proof completed.
< Prove_Constraint looseEval:host:proj_expr_is.
Variables: F T C
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
============================
is_expr (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0)))
< case IsE.
Variables: F T C
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_expr (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0)))
< search 10.
Proof completed.
< Prove_Constraint looseEval:host:proj_stmt_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_stmt_is.
Proof completed.
< Prove_Constraint looseEval:host:proj_stmt_other.
Proof completed.
< Prove_Constraint looseEval:host:proj_fun_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_fun_is.
Proof completed.
< Prove_Constraint looseEval:host:proj_param_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_param_is.
Proof completed.
< Prove_Constraint looseEval:host:proj_program_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_program_is.
Proof completed.
< Prove_Constraint looseEval:host:proj_typ_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_typ_is.
Proof completed.
< Prove_Constraint looseEval:host:proj_value_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_value_is.
Proof completed.
< Add_Proj_Rel looseEval:host:is_expr,
looseEval:host:is_args,
looseEval:host:is_recFieldExprs.
Proof completed.
< Prove_Ext_Ind looseEval:host:is_expr,
looseEval:host:is_args,
looseEval:host:is_recFieldExprs.
Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Subgoal 1.20:
Variables: Expr Expr1 Expr2
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
R : is_expr (condExpr Expr2 Expr1 Expr) @
R1 : is_expr Expr2 *
R2 : is_expr Expr1 *
R3 : is_expr Expr *
============================
<is_expr {P}> (condExpr Expr2 Expr1 Expr)
< apply IH to R1.
Subgoal 1.20:
Variables: Expr Expr1 Expr2
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
R : is_expr (condExpr Expr2 Expr1 Expr) @
R1 : is_expr Expr2 *
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr2
============================
<is_expr {P}> (condExpr Expr2 Expr1 Expr)
< apply IH to R2.
Subgoal 1.20:
Variables: Expr Expr1 Expr2
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
R : is_expr (condExpr Expr2 Expr1 Expr) @
R1 : is_expr Expr2 *
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr2
H2 : <is_expr {P}> Expr1
============================
<is_expr {P}> (condExpr Expr2 Expr1 Expr)
< apply IH to R3.
Subgoal 1.20:
Variables: Expr Expr1 Expr2
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
R : is_expr (condExpr Expr2 Expr1 Expr) @
R1 : is_expr Expr2 *
R2 : is_expr Expr1 *
R3 : is_expr Expr *
H1 : <is_expr {P}> Expr2
H2 : <is_expr {P}> Expr1
H3 : <is_expr {P}> Expr
============================
<is_expr {P}> (condExpr Expr2 Expr1 Expr)
< search 20.
Proof completed.
< Add_Proj_Rel looseEval:host:is_stmt.
Proof completed.
< Prove_Ext_Ind looseEval:host:is_stmt.
Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Proof completed.
< Prove looseEval:host:is_args_nilArgs_or_consArgs.
Proof completed.
< Prove looseEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs.
Proof completed.
< Add_Proj_Rel looseEval:host:is_value,
looseEval:host:is_recFieldVals.
Proof completed.
< Prove_Ext_Ind looseEval:host:is_value,
looseEval:host:is_recFieldVals.
Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size
Proof completed.
< Prove looseEval:host:is_value_intVal_or_not.
Proof completed.
< Prove looseEval:host:is_value_trueVal_or_not.
Proof completed.
< Prove looseEval:host:is_value_falseVal_or_not.
Proof completed.
< Prove looseEval:host:is_value_stringVal_or_not.
Proof completed.
< Prove looseEval:host:is_value_recVal_or_not.
Proof completed.
< Prove looseEval:host:is_recFieldVals_nil_or_cons.
Proof completed.
< Prove looseEval:host:is_value_eq_or_not,
looseEval:host:is_recFieldVals_eq_or_not.
Proof completed.
< Prove looseEval:host:vars_unique.
Subgoal 1.20:
Variables: V1 V2 V3 V4 V5 V6 F T C
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 (condExpr C T F)
VarsA : vars (condExpr C T F) V1 @
VarsB : vars (condExpr C T F) V2
VarsA1 : vars C V3 *
VarsA2 : vars T V4 *
VarsA3 : vars F V5 *
VarsA4 : V3 ++ V4 = V6
VarsA5 : V6 ++ V5 = V1
============================
V1 = V2
< case IsE.
Subgoal 1.20:
Variables: V1 V2 V3 V4 V5 V6 F T C
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 (condExpr C T F) V1 @
VarsB : vars (condExpr C T F) V2
VarsA1 : vars C V3 *
VarsA2 : vars T V4 *
VarsA3 : vars F V5 *
VarsA4 : V3 ++ V4 = V6
VarsA5 : V6 ++ V5 = V1
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
V1 = V2
< VarsB: case VarsB.
Subgoal 1.20:
Variables: V1 V2 V3 V4 V5 V6 F T C V7 V8 V9 V10
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 (condExpr C T F) V1 @
VarsA1 : vars C V3 *
VarsA2 : vars T V4 *
VarsA3 : vars F V5 *
VarsA4 : V3 ++ V4 = V6
VarsA5 : V6 ++ V5 = V1
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
VarsB : vars C V7
VarsB1 : vars T V8
VarsB2 : vars F V9
VarsB3 : V7 ++ V8 = V10
VarsB4 : V10 ++ V9 = V2
============================
V1 = V2
< apply IH to _ VarsA1 VarsB.
Subgoal 1.20:
Variables: V1 V2 V4 V5 V6 F T C V7 V8 V9 V10
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 (condExpr C T F) V1 @
VarsA1 : vars C V7 *
VarsA2 : vars T V4 *
VarsA3 : vars F V5 *
VarsA4 : V7 ++ V4 = V6
VarsA5 : V6 ++ V5 = V1
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
VarsB : vars C V7
VarsB1 : vars T V8
VarsB2 : vars F V9
VarsB3 : V7 ++ V8 = V10
VarsB4 : V10 ++ V9 = V2
============================
V1 = V2
< apply IH to _ VarsA2 VarsB1.
Subgoal 1.20:
Variables: V1 V2 V5 V6 F T C V7 V8 V9 V10
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 (condExpr C T F) V1 @
VarsA1 : vars C V7 *
VarsA2 : vars T V8 *
VarsA3 : vars F V5 *
VarsA4 : V7 ++ V8 = V6
VarsA5 : V6 ++ V5 = V1
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
VarsB : vars C V7
VarsB1 : vars T V8
VarsB2 : vars F V9
VarsB3 : V7 ++ V8 = V10
VarsB4 : V10 ++ V9 = V2
============================
V1 = V2
< apply IH to _ VarsA3 VarsB2.
Subgoal 1.20:
Variables: V1 V2 V6 F T C V7 V8 V9 V10
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 (condExpr C T F) V1 @
VarsA1 : vars C V7 *
VarsA2 : vars T V8 *
VarsA3 : vars F V9 *
VarsA4 : V7 ++ V8 = V6
VarsA5 : V6 ++ V9 = V1
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
VarsB : vars C V7
VarsB1 : vars T V8
VarsB2 : vars F V9
VarsB3 : V7 ++ V8 = V10
VarsB4 : V10 ++ V9 = V2
============================
V1 = V2
< apply append_unique to VarsA4 VarsB3.
Subgoal 1.20:
Variables: V1 V2 F T C V7 V8 V9 V10
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 (condExpr C T F) V1 @
VarsA1 : vars C V7 *
VarsA2 : vars T V8 *
VarsA3 : vars F V9 *
VarsA4 : V7 ++ V8 = V10
VarsA5 : V10 ++ V9 = V1
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
VarsB : vars C V7
VarsB1 : vars T V8
VarsB2 : vars F V9
VarsB3 : V7 ++ V8 = V10
VarsB4 : V10 ++ V9 = V2
============================
V1 = V2
< apply append_unique to VarsA5 VarsB4.
Subgoal 1.20:
Variables: V2 F T C V7 V8 V9 V10
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 (condExpr C T F) V2 @
VarsA1 : vars C V7 *
VarsA2 : vars T V8 *
VarsA3 : vars F V9 *
VarsA4 : V7 ++ V8 = V10
VarsA5 : V10 ++ V9 = V2
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
VarsB : vars C V7
VarsB1 : vars T V8
VarsB2 : vars F V9
VarsB3 : V7 ++ V8 = V10
VarsB4 : V10 ++ V9 = V2
============================
V2 = V2
< search.
Proof completed.
< Prove looseEval:host:vars_is.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F)
V : vars (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
============================
is_list is_string V
< case IsE.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_list is_string V
< apply IH to _ V1.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_string V2
============================
is_list is_string V
< apply IH to _ V2.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_string V2
H5 : is_list is_string V3
============================
is_list is_string V
< apply IH to _ V3.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_string V2
H5 : is_list is_string V3
H6 : is_list is_string V4
============================
is_list is_string V
< apply append_list_string_is to _ _ V4.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_string V2
H5 : is_list is_string V3
H6 : is_list is_string V4
H7 : is_list is_string V5
============================
is_list is_string V
< apply append_list_string_is to _ _ V5.
Subgoal 1.20:
Variables: V V2 V3 V4 V5 F T C
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 (condExpr C T F) V @
V1 : vars C V2 *
V2 : vars T V3 *
V3 : vars F V4 *
V4 : V2 ++ V3 = V5
V5 : V5 ++ V4 = V
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_string V2
H5 : is_list is_string V3
H6 : is_list is_string V4
H7 : is_list is_string V5
H8 : is_list is_string V
============================
is_list is_string V
< search.
Proof completed.
< Prove looseEval:host:vars_exist,
looseEval:host:varsArgs_exist,
looseEval:host:varsRecFields_exist.
Subgoal 1.20:
Variables: Expr Expr1 Expr2
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< V1: apply IH to IsE1.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< V2: apply IH to IsE2.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< V3: apply IH to IsE3.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< Is1: apply vars_is to _ V1.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
Is1 : is_list is_string V
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< Is2: apply vars_is to _ V2.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
Is1 : is_list is_string V
Is2 : is_list is_string V1
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< Is3: apply vars_is to _ V3.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
Is1 : is_list is_string V
Is2 : is_list is_string V1
Is3 : is_list is_string V2
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< A: apply append_list_string_total to Is1 Is2.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2 L3
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
Is1 : is_list is_string V
Is2 : is_list is_string V1
Is3 : is_list is_string V2
A : V ++ V1 = L3
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< IsA: apply append_list_string_is to _ _ A.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2 L3
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
Is1 : is_list is_string V
Is2 : is_list is_string V1
Is3 : is_list is_string V2
A : V ++ V1 = L3
IsA : is_list is_string L3
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< apply append_list_string_total to IsA Is3.
Subgoal 1.20:
Variables: Expr Expr1 Expr2 V V1 V2 L3 L1
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 (condExpr Expr2 Expr1 Expr) @
IsE1 : is_expr Expr2 *
IsE2 : is_expr Expr1 *
IsE3 : is_expr Expr *
V1 : vars Expr2 V
V2 : vars Expr1 V1
V3 : vars Expr V2
Is1 : is_list is_string V
Is2 : is_list is_string V1
Is3 : is_list is_string V2
A : V ++ V1 = L3
IsA : is_list is_string L3
H1 : L3 ++ V2 = L1
============================
exists V, vars (condExpr Expr2 Expr1 Expr) V
< search.
Proof completed.
< Prove_Constraint looseEval:host:proj_vars.
Variables: V V_P X F T C
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
V : vars (condExpr C T F) V
V_P : vars (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V_P
Mem : mem X V
============================
mem X V_P
< V: case V.
Variables: V V_P X F T C V2 V3 V4 V5
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
V_P : vars (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V_P
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
============================
mem X V_P
< V_P: case V_P.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P : vars (and (eq C true) (or (eq T (num 0)) true)) V1
V_P1 : vars (eq F (num 0)) V6
V_P2 : V1 ++ V6 = V_P
============================
mem X V_P
< V_P: case V_P1.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V8
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P : vars (and (eq C true) (or (eq T (num 0)) true)) V1
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P3 : vars (num 0) V8
V_P4 : V7 ++ V8 = V6
============================
mem X V_P
< case V_P3.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P : vars (and (eq C true) (or (eq T (num 0)) true)) V1
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
============================
mem X V_P
< V_P: case V_P.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P : vars (eq C true) V9
V_P3 : vars (or (eq T (num 0)) true) V10
V_P5 : V9 ++ V10 = V1
============================
mem X V_P
< V_P: case V_P.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11 V12
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P3 : vars (or (eq T (num 0)) true) V10
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P6 : vars true V12
V_P7 : V11 ++ V12 = V9
============================
mem X V_P
< case V_P6.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P3 : vars (or (eq T (num 0)) true) V10
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
============================
mem X V_P
< V_P: case V_P3.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11 V13 V14
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
V_P3 : vars (eq T (num 0)) V13
V_P6 : vars true V14
V_P8 : V13 ++ V14 = V10
============================
mem X V_P
< case V_P6.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11 V13
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
V_P3 : vars (eq T (num 0)) V13
V_P8 : V13 ++ [] = V10
============================
mem X V_P
< V_P: case V_P3.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11 V13 V15 V16
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
V_P8 : V13 ++ [] = V10
V_P3 : vars T V15
V_P6 : vars (num 0) V16
V_P9 : V15 ++ V16 = V13
============================
mem X V_P
< case V_P6.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11 V13 V15
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
V_P8 : V13 ++ [] = V10
V_P3 : vars T V15
V_P9 : V15 ++ [] = V13
============================
mem X V_P
< apply append_nil_right to V_P9.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11 V13
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
V_P8 : V13 ++ [] = V10
V_P3 : vars T V13
V_P9 : V13 ++ [] = V13
============================
mem X V_P
< apply append_nil_right to V_P8.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10 V11
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V11
V_P7 : V11 ++ [] = V9
V_P8 : V10 ++ [] = V10
V_P3 : vars T V10
V_P9 : V10 ++ [] = V10
============================
mem X V_P
< apply append_nil_right to V_P7.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V7 V9 V10
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V7
V_P4 : V7 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V9
V_P7 : V9 ++ [] = V9
V_P8 : V10 ++ [] = V10
V_P3 : vars T V10
V_P9 : V10 ++ [] = V10
============================
mem X V_P
< apply append_nil_right to V_P4.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V9 V10
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V6
V_P4 : V6 ++ [] = V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V9
V_P7 : V9 ++ [] = V9
V_P8 : V10 ++ [] = V10
V_P3 : vars T V10
V_P9 : V10 ++ [] = V10
============================
mem X V_P
< clear V_P9
V_P8
V_P7
V_P4.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V9 V10
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V9
V_P3 : vars T V10
============================
mem X V_P
< case IsE.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V9 V10
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V6
V_P5 : V9 ++ V10 = V1
V_P : vars C V9
V_P3 : vars T V10
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
mem X V_P
< apply vars_unique to _ V_P V.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6 V10
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V6
V_P5 : V2 ++ V10 = V1
V_P : vars C V2
V_P3 : vars T V10
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
mem X V_P
< apply vars_unique to _ V_P3 V1.
Variables: V V_P X F T C V2 V3 V4 V5 V1 V6
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V6 = V_P
V_P1 : vars F V6
V_P5 : V2 ++ V3 = V1
V_P : vars C V2
V_P3 : vars T V3
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
mem X V_P
< apply vars_unique to _ V_P1 V2.
Variables: V V_P X F T C V2 V3 V4 V5 V1
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V5
V4 : V5 ++ V4 = V
V_P2 : V1 ++ V4 = V_P
V_P1 : vars F V4
V_P5 : V2 ++ V3 = V1
V_P : vars C V2
V_P3 : vars T V3
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
mem X V_P
< apply append_unique to V3 V_P5.
Variables: V V_P X F T C V2 V3 V4 V1
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
Mem : mem X V
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V1
V4 : V1 ++ V4 = V
V_P2 : V1 ++ V4 = V_P
V_P1 : vars F V4
V_P5 : V2 ++ V3 = V1
V_P : vars C V2
V_P3 : vars T V3
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
mem X V_P
< apply append_unique to V4 V_P2.
Variables: V_P X F T C V2 V3 V4 V1
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
Mem : mem X V_P
V : vars C V2
V1 : vars T V3
V2 : vars F V4
V3 : V2 ++ V3 = V1
V4 : V1 ++ V4 = V_P
V_P2 : V1 ++ V4 = V_P
V_P1 : vars F V4
V_P5 : V2 ++ V3 = V1
V_P : vars C V2
V_P3 : vars T V3
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
mem X V_P
< search.
Proof completed.
< Prove looseEval:host:typeOf_isTy.
Subgoal 1.22:
Variables: FT ET Ty F T C
IH_E : 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
IH_A : 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
IH_RF : 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 (condExpr C T F)
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 (condExpr C T F) Ty @
Ty1 : typeOf FT ET C boolTy *
Ty2 : typeOf FT ET T Ty *
Ty3 : typeOf FT ET F Ty *
============================
is_typ Ty
< case IsE.
Subgoal 1.22:
Variables: FT ET Ty F T C
IH_E : 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
IH_A : 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
IH_RF : 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 (condExpr C T F) Ty @
Ty1 : typeOf FT ET C boolTy *
Ty2 : typeOf FT ET T Ty *
Ty3 : typeOf FT ET F Ty *
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_typ Ty
< apply IH_E to _ _ _ Ty2.
Subgoal 1.22:
Variables: FT ET Ty F T C
IH_E : 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
IH_A : 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
IH_RF : 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 (condExpr C T F) Ty @
Ty1 : typeOf FT ET C boolTy *
Ty2 : typeOf FT ET T Ty *
Ty3 : typeOf FT ET F Ty *
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_typ Ty
============================
is_typ Ty
< search.
Proof completed.
< Prove looseEval:host:stmtOK_isCtx.
Proof completed.
< Prove looseEval:host:stmtOK_keep_scopes.
Proof completed.
< Prove looseEval:host:stmtOK_older_scopes_same.
Proof completed.
< Prove looseEval:host:stmtOK_first_scope_lookup_same.
Proof completed.
< Prove looseEval:host:typeOf_unique.
Subgoal 1.22:
Variables: FT ET_A ET_B TyA TyB F T C
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_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 (condExpr C T F)
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 (condExpr C T F) TyA @
TyB : typeOf FT ET_B (condExpr C T F) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A C boolTy *
TyA2 : typeOf FT ET_A T TyA *
TyA3 : typeOf FT ET_A F TyA *
============================
TyA = TyB
< case IsE.
Subgoal 1.22:
Variables: FT ET_A ET_B TyA TyB F T C
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_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 (condExpr C T F) TyA @
TyB : typeOf FT ET_B (condExpr C T F) TyB
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A C boolTy *
TyA2 : typeOf FT ET_A T TyA *
TyA3 : typeOf FT ET_A F TyA *
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
TyA = TyB
< TyB: case TyB.
Subgoal 1.22:
Variables: FT ET_A ET_B TyA TyB F T C
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_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 (condExpr C T F) TyA @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A C boolTy *
TyA2 : typeOf FT ET_A T TyA *
TyA3 : typeOf FT ET_A F TyA *
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
TyB : typeOf FT ET_B C boolTy
TyB1 : typeOf FT ET_B T TyB
TyB2 : typeOf FT ET_B F TyB
============================
TyA = TyB
< apply IH_E to _ _ _ _ TyA2 TyB1 _.
Subgoal 1.22:
Variables: FT ET_A ET_B TyB F T C
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_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 (condExpr C T F) TyB @
Lkp : lookup_all_scopes ET_A ET_B
TyA1 : typeOf FT ET_A C boolTy *
TyA2 : typeOf FT ET_A T TyB *
TyA3 : typeOf FT ET_A F TyB *
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
TyB : typeOf FT ET_B C boolTy
TyB1 : typeOf FT ET_B T TyB
TyB2 : typeOf FT ET_B F TyB
============================
TyB = TyB
< search.
Proof completed.
< Prove looseEval:host:stmtOK_unique.
Proof completed.
< Prove looseEval:host:paramTy_is.
Proof completed.
< Prove looseEval:host:getFunInfo_is.
Proof completed.
< Prove looseEval:host:paramTy_exists.
Proof completed.
< Prove looseEval:host:getFunInfo_exists.
Proof completed.
< Prove looseEval:host:evalExpr_isValue,
looseEval:host:evalStmt_isCtx,
looseEval:host:evalArgs_isValue,
looseEval:host:evalRecFields_isValue.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
is_list is_value V
IH_V_RF : forall FE 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 O * ->
is_recFieldVals V
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
============================
is_value V
< case IsE.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
is_list is_value V
IH_V_RF : forall FE 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 O * ->
is_recFieldVals 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_value V
< apply IH_V_E to _ _ _ Ev2.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
is_list is_value V
IH_V_RF : forall FE 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 O * ->
is_recFieldVals 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_value V
============================
is_value V
< search.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
is_list is_value V
IH_V_RF : forall FE 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 O * ->
is_recFieldVals V
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
============================
is_value V
< case IsE.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
is_list is_value V
IH_V_RF : forall FE 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 O * ->
is_recFieldVals 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_value V
< apply IH_V_E to _ _ _ Ev2.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_V_E : forall FE 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 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_V_A : forall FE 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 O * ->
is_list is_value V
IH_V_RF : forall FE 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 O * ->
is_recFieldVals 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_value V
============================
is_value V
< search.
Proof completed.
< Prove looseEval:host:evalExpr_isOutput,
looseEval:host:evalStmt_isOutput,
looseEval:host:evalArgs_isOutput,
looseEval:host:evalRecFields_isOutput.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 O * ->
is_list is_value O
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_list is_value O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_value O2
============================
is_list is_value O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_value O2
H5 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_value O2
H5 : is_list is_value O3
H6 : is_list is_value O
============================
is_list is_value O
< search.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 O * ->
is_list is_value O
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
============================
is_list is_value O
< case IsE.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
is_list is_value O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_value O2
============================
is_list is_value O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_value O2
H5 : is_list is_value O3
============================
is_list is_value O
< apply append_values_is to _ _ Ev3.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall FE 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 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 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 O * ->
is_list is_value O
IH_RF : forall FE 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : is_list is_value O2
H5 : is_list is_value O3
H6 : is_list is_value O
============================
is_list is_value O
< search.
Proof completed.
< Prove looseEval:host:paramName_is.
Proof completed.
< Prove looseEval:host:getFunEvalInfo_is.
Proof completed.
< Prove looseEval:host:evalProgram_isOutput.
Proof completed.
< Prove looseEval:host:evalStmt_names_same.
Proof completed.
< Add_Ext_Size looseEval:host:evalExpr,
looseEval:host:evalArgs,
looseEval:host:evalRecFields,
looseEval:host:evalStmt.
Proof completed.
< Add_Proj_Rel looseEval:host:evalExpr,
looseEval:host:evalArgs,
looseEval:host:evalRecFields,
looseEval:host:evalStmt.
Proof completed.
< Prove looseEval:host:evalExpr_rel,
looseEval:host:evalStmt_newNameScopes_output,
looseEval:host:evalStmt_newNameScopes,
looseEval:host:evalArgs_rel,
looseEval:host:evalRecFields_rel.
Subgoal 1.26:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) VA O_A @
EvB : evalExpr FE EE_B (condExpr C T F) VB O_B
Vars : vars (condExpr C T F) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
============================
VA = VB /\ O_A = O_B
< case IsE.
Subgoal 1.26:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
EvB : evalExpr FE EE_B (condExpr C T F) VB O_B
Vars : vars (condExpr C T F) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
VA = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.26:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
EvB : evalExpr FE EE_B (condExpr C T F) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
============================
VA = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.26.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.26.1.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.26.1.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars3.
Subgoal 1.26.1.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
============================
lookupScopes X EE_A V
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.26.1.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M'' L.
Subgoal 1.26.1.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
H4 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.26.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars1 _.
Subgoal 1.26.1.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V2 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.26.1.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars3.
Subgoal 1.26.1.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X V4
============================
lookupScopes X EE_A V
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.26.1.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M'' L.
Subgoal 1.26.1.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V2
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
H4 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.26.1:
Variables: FE EE_A EE_B VB O_A O_B Vars F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VB O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VB O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
VB = VB /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.26.1:
Variables: FE EE_A EE_B VB O_B Vars F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VB O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VB O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
VB = VB /\ O_B = O_B
< search.
Subgoal 1.26.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.26.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.26.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars3.
Subgoal 1.26.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
============================
lookupScopes X EE_A V
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.26.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M'' L.
Subgoal 1.26.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
H4 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.27:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) VA O_A @
EvB : evalExpr FE EE_B (condExpr C T F) VB O_B
Vars : vars (condExpr C T F) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
============================
VA = VB /\ O_A = O_B
< case IsE.
Subgoal 1.27:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
EvB : evalExpr FE EE_B (condExpr C T F) VB O_B
Vars : vars (condExpr C T F) Vars
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
VA = VB /\ O_A = O_B
< Vars: case Vars.
Subgoal 1.27:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
EvB : evalExpr FE EE_B (condExpr C T F) VB O_B
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
============================
VA = VB /\ O_A = O_B
< EvB: case EvB.
Subgoal 1.27.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.27.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.27.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars3.
Subgoal 1.27.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
============================
lookupScopes X EE_A V
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.27.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M'' L.
Subgoal 1.27.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
H4 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.27.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA1 EvB Vars _.
Subgoal 1.27.2.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V1 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.27.2.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_left to M Vars3.
Subgoal 1.27.2.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
============================
lookupScopes X EE_A V
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.27.2.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M'' L.
Subgoal 1.27.2.1:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O1 O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V1
L : lookupScopes X EE_B V
M' : mem X V4
M'' : mem X Vars
H4 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.27.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
VA = VB /\ O_A = O_B
< apply IH_E to _ _ _ _ EvA2 EvB1 Vars2 _.
Subgoal 1.27.2.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
forall X V, mem X V3 -> lookupScopes X EE_B V -> lookupScopes X EE_A V
< intros M L.
Subgoal 1.27.2.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
============================
lookupScopes X EE_A V
< M': apply mem_append_right to M Vars4.
Subgoal 1.27.2.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
M' : mem X Vars
============================
lookupScopes X EE_A V
< apply Rel to M' L.
Subgoal 1.27.2.2:
Variables: FE EE_A EE_B VA VB O_A O_B Vars O2 F T C V1 V2 V3 V4 O3 O4 X V
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VA O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O3 ++ O2 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
M : mem X V3
L : lookupScopes X EE_B V
M' : mem X Vars
H4 : lookupScopes X EE_A V
============================
lookupScopes X EE_A V
< search.
Subgoal 1.27.2:
Variables: FE EE_A EE_B VB O_A O_B Vars F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VB O_A @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VB O4 *
EvA3 : O3 ++ O4 = O_A
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
VB = VB /\ O_A = O_B
< apply append_unique to EvA3 EvB2.
Subgoal 1.27.2:
Variables: FE EE_A EE_B VB O_B Vars F T C V1 V2 V3 V4 O3 O4
IH_E : forall FE EE_A EE_B E VA VB O_A O_B Vars,
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 O_A * -> evalExpr FE EE_B E VB O_B -> vars E Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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_A : forall FE EE_A EE_B A VA VB O_A O_B Vars,
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 O_A * -> evalArgs FE EE_B A VB O_B -> varsArgs A Vars ->
(forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_B
IH_RF : forall FE EE_A EE_B RF VA VB O_A O_B Vars,
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 O_A * -> evalRecFields FE EE_B RF VB O_B ->
varsRecFields RF Vars -> (forall X V,
mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V) -> VA = VB /\
O_A = O_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 (condExpr C T F) VB O_B @
Rel : forall X V, mem X Vars -> lookupScopes X EE_B V -> lookupScopes X EE_A V
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VB O4 *
EvA3 : O3 ++ O4 = O_B
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V1
Vars1 : vars T V2
Vars2 : vars F V3
Vars3 : V1 ++ V2 = V4
Vars4 : V4 ++ V3 = Vars
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = O_B
============================
VB = VB /\ O_B = O_B
< search.
Proof completed.
< Prove looseEval:host:evalExpr_rel_exists_ES,
looseEval:host:evalStmt_newNameScopes_exists_ES,
looseEval:host:evalArgs_rel_exists_ES,
looseEval:host:evalRecFields_rel_exists_ES.
Subgoal 1.26:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O ES @
Vars : vars (condExpr C T F) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< case IsE.
Subgoal 1.26:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Vars : vars (condExpr C T F) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< Vars: case Vars.
Subgoal 1.26:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< apply IH_E to _ _ _ _ EvB3 Vars _ with
EE_A = EE_A.
Subgoal 1.26.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.26.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars3.
Subgoal 1.26.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X V5
============================
lookupScopes X EE_A V1
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.26.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X V5
M'' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M'' L.
Subgoal 1.26.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X V5
M'' : mem X Vars
H4 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.26:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< apply IH_E to _ _ _ _ EvB4 Vars1 _ with
EE_A = EE_A.
Subgoal 1.26.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
============================
forall X V1, mem X V3 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.26.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars3.
Subgoal 1.26.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X V5
============================
lookupScopes X EE_A V1
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.26.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X V5
M'' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M'' L.
Subgoal 1.26.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
M : mem X V3
L : lookupScopes X EE_B V1
M' : mem X V5
M'' : mem X Vars
H5 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.26:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C trueVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B T V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C trueVal O2 N2
H5 : <evalExpr {ES}> FE EE_A T V O3 N1
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< search.
Subgoal 1.27:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V O ES
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O ES @
Vars : vars (condExpr C T F) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< case IsE.
Subgoal 1.27:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Vars : vars (condExpr C T F) Vars
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< Vars: case Vars.
Subgoal 1.27:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< apply IH_E to _ _ _ _ EvB3 Vars _ with
EE_A = EE_A.
Subgoal 1.27.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
============================
forall X V1, mem X V2 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.27.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_left to M Vars3.
Subgoal 1.27.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X V5
============================
lookupScopes X EE_A V1
< M'': apply mem_append_left to M' Vars4.
Subgoal 1.27.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X V5
M'' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M'' L.
Subgoal 1.27.1:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
M : mem X V2
L : lookupScopes X EE_B V1
M' : mem X V5
M'' : mem X Vars
H4 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.27:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C falseVal O2 N2
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< apply IH_E to _ _ _ _ EvB4 Vars2 _ with
EE_A = EE_A.
Subgoal 1.27.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C falseVal O2 N2
============================
forall X V1, mem X V4 -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
< intros M L.
Subgoal 1.27.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C falseVal O2 N2
M : mem X V4
L : lookupScopes X EE_B V1
============================
lookupScopes X EE_A V1
< M': apply mem_append_right to M Vars4.
Subgoal 1.27.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C falseVal O2 N2
M : mem X V4
L : lookupScopes X EE_B V1
M' : mem X Vars
============================
lookupScopes X EE_A V1
< apply Rel to M' L.
Subgoal 1.27.2:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5 X V1
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C falseVal O2 N2
M : mem X V4
L : lookupScopes X EE_B V1
M' : mem X Vars
H5 : lookupScopes X EE_A V1
============================
lookupScopes X EE_A V1
< search.
Subgoal 1.27:
Variables: FE EE_A EE_B V O ES Vars N2 N1 N3 O2 O3 F T C V2 V3 V4 V5
IH_E : forall FE EE_A EE_B E V O ES Vars,
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 O ES * -> vars E Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalExpr {ES}> FE EE_A E V 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 O ES Vars,
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 O ES * -> varsArgs A Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalArgs {ES}> FE EE_A A V O ES
IH_RF : forall FE EE_A EE_B RF V O ES Vars,
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 O ES * -> varsRecFields RF Vars -> (forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1) -> <evalRecFields {ES}> FE EE_A RF V 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 (condExpr C T F) V O ES @
Rel : forall X V1,
mem X Vars -> lookupScopes X EE_B V1 -> lookupScopes X EE_A V1
EvB1 : 1 + N3 = ES
EvB2 : N2 + N1 = N3
EvB3 : <evalExpr {ES}> FE EE_B C falseVal O2 N2 *
EvB4 : <evalExpr {ES}> FE EE_B F V O3 N1 *
EvB5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Vars : vars C V2
Vars1 : vars T V3
Vars2 : vars F V4
Vars3 : V2 ++ V3 = V5
Vars4 : V5 ++ V4 = Vars
H4 : <evalExpr {ES}> FE EE_A C falseVal O2 N2
H5 : <evalExpr {ES}> FE EE_A F V O3 N1
============================
<evalExpr {ES}> FE EE_A (condExpr C T F) V O ES
< search.
Proof completed.
< Prove looseEval:host:evalExpr_scopes_same,
looseEval:host:evalStmt_scopes_same,
looseEval:host:evalStmt_scopes_same_ctx,
looseEval:host:evalArgs_scopes_same,
looseEval:host:evalRecFields_scopes_same.
Subgoal 1.26:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) VA OA @
EvB : evalExpr FE EE_B (condExpr C T F) VB OB
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = OA
============================
VA = VB /\ OA = OB
< case IsE.
Subgoal 1.26:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvB : evalExpr FE EE_B (condExpr C T F) VB OB
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
VA = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.26.1:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.26.1:
Variables: FE EE_A VA OA EE_B VB OB O2 F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA2 EvB1.
Subgoal 1.26.1:
Variables: FE EE_A OA EE_B VB OB F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VB OA @
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VB O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = OB
============================
VB = VB /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.26.1:
Variables: FE EE_A EE_B VB OB F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VB OB @
EvA1 : evalExpr FE EE_A C trueVal O3 *
EvA2 : evalExpr FE EE_A T VB O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = OB
============================
VB = VB /\ OB = OB
< search.
Subgoal 1.26.2:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvA1 : evalExpr FE EE_A C trueVal O1 *
EvA2 : evalExpr FE EE_A T VA O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.27:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) VA OA @
EvB : evalExpr FE EE_B (condExpr C T F) VB OB
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = OA
============================
VA = VB /\ OA = OB
< case IsE.
Subgoal 1.27:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvB : evalExpr FE EE_B (condExpr C T F) VB OB
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
VA = VB /\ OA = OB
< EvB: case EvB.
Subgoal 1.27.1:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C trueVal O3
EvB1 : evalExpr FE EE_B T VB O4
EvB2 : O3 ++ O4 = OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.27.2:
Variables: FE EE_A VA OA EE_B VB OB O1 O2 F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvA1 : evalExpr FE EE_A C falseVal O1 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O1 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB.
Subgoal 1.27.2:
Variables: FE EE_A VA OA EE_B VB OB O2 F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VA OA @
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VA O2 *
EvA3 : O3 ++ O2 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = OB
============================
VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA2 EvB1.
Subgoal 1.27.2:
Variables: FE EE_A OA EE_B VB OB F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VB OA @
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VB O4 *
EvA3 : O3 ++ O4 = OA
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = OB
============================
VB = VB /\ OA = OB
< apply append_unique to EvA3 EvB2.
Subgoal 1.27.2:
Variables: FE EE_A EE_B VB OB F T C O3 O4
IH_E : forall E FE EE_A VA OA EE_B VB 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 OA * -> evalExpr FE EE_B E VB OB ->
VA = VB /\ OA = OB
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 OA EE_B VB 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 OA * -> evalArgs FE EE_B A VB OB ->
VA = VB /\ OA = OB
IH_RF : forall RF FE EE_A VA OA EE_B VB 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 OA * -> evalRecFields FE EE_B RF VB OB ->
VA = VB /\ OA = OB
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 (condExpr C T F) VB OB @
EvA1 : evalExpr FE EE_A C falseVal O3 *
EvA2 : evalExpr FE EE_A F VB O4 *
EvA3 : O3 ++ O4 = OB
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
EvB : evalExpr FE EE_B C falseVal O3
EvB1 : evalExpr FE EE_B F VB O4
EvB2 : O3 ++ O4 = OB
============================
VB = VB /\ OB = OB
< search.
Proof completed.
< Prove looseEval:host:evalExpr_scopes_same_exists,
looseEval:host:evalStmt_scopes_same_exists,
looseEval:host:evalArgs_scopes_same_exists,
looseEval:host:evalRecFields_scopes_same_exists.
Subgoal 1.26:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C trueVal O2 *
EvA2 : evalExpr FE EE_A T V O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (condExpr C T F) V O
< case IsE.
Subgoal 1.26:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C trueVal O2 *
EvA2 : evalExpr FE EE_A T V O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
evalExpr FE EE_B (condExpr C T F) V O
< apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.26:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C trueVal O2 *
EvA2 : evalExpr FE EE_A T V O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : evalExpr FE EE_B C trueVal O2
============================
evalExpr FE EE_B (condExpr C T F) V O
< apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.26:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C trueVal O2 *
EvA2 : evalExpr FE EE_A T V O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : evalExpr FE EE_B C trueVal O2
H5 : evalExpr FE EE_B T V O3
============================
evalExpr FE EE_B (condExpr C T F) V O
< search.
Subgoal 1.27:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V O
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C falseVal O2 *
EvA2 : evalExpr FE EE_A F V O3 *
EvA3 : O2 ++ O3 = O
============================
evalExpr FE EE_B (condExpr C T F) V O
< case IsE.
Subgoal 1.27:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C falseVal O2 *
EvA2 : evalExpr FE EE_A F V O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
evalExpr FE EE_B (condExpr C T F) V O
< apply IH_E to _ _ _ _ SS EvA1.
Subgoal 1.27:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C falseVal O2 *
EvA2 : evalExpr FE EE_A F V O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : evalExpr FE EE_B C falseVal O2
============================
evalExpr FE EE_B (condExpr C T F) V O
< apply IH_E to _ _ _ _ SS EvA2.
Subgoal 1.27:
Variables: FE EE_A V O EE_B O2 O3 F T C
IH_E : forall E FE EE_A V 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 O * -> evalExpr FE EE_B E V 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 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 O * -> evalArgs FE EE_B A V O
IH_RF : forall RF FE EE_A V 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 O * -> evalRecFields FE EE_B RF V 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 (condExpr C T F) V O @
EvA1 : evalExpr FE EE_A C falseVal O2 *
EvA2 : evalExpr FE EE_A F V O3 *
EvA3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : evalExpr FE EE_B C falseVal O2
H5 : evalExpr FE EE_B F V O3
============================
evalExpr FE EE_B (condExpr C T F) V O
< search.
Proof completed.
< Theorem append_nil_output :
forall O, is_list is_value O -> O ++ [] = O.
============================
forall O, is_list is_value O -> O ++ [] = O
< induction on 1.
IH : forall O, is_list is_value O * -> O ++ [] = O
============================
forall O, is_list is_value O @ -> O ++ [] = O
< intros Is.
Variables: O
IH : forall O, is_list is_value O * -> O ++ [] = O
Is : is_list is_value O @
============================
O ++ [] = O
< Is: case Is.
Subgoal 1:
IH : forall O, is_list is_value O * -> O ++ [] = O
============================
[] ++ [] = []
< search.
Subgoal 2:
Variables: T H
IH : forall O, is_list is_value O * -> O ++ [] = O
Is : is_value H
Is1 : is_list is_value T *
============================
H::T ++ [] = H::T
< apply IH to Is1.
Subgoal 2:
Variables: T H
IH : forall O, is_list is_value O * -> O ++ [] = O
Is : is_value H
Is1 : is_list is_value T *
H1 : T ++ [] = T
============================
H::T ++ [] = H::T
< search.
Proof completed.
< Prove_Constraint looseEval:host:proj_evalExpr_exists.
Variables: FE EE V O F T C
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< case IsE.
Variables: FE EE V O F T C
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 (condExpr C T F) V O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< Ev: case Ev.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< IsV: apply evalExpr_isValue to _ _ _ Ev1.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< apply append_nil_output to IsO2.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< apply append_nil_output to IsO3.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< Or: apply is_value_eq_or_not to IsV _ with
V2 = intVal 0.
Subgoal 1:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
Or : V = intVal 0 \/ (V = intVal 0 -> false)
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< E: case Or.
Subgoal 1.1:
Variables: FE EE O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T (intVal 0) O3
Ev2 : O2 ++ O3 = O
IsV : is_value (intVal 0)
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< search.
Subgoal 1.2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C trueVal O2
Ev1 : evalExpr FE EE T V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
E : V = intVal 0 -> false
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< search.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< IsV: apply evalExpr_isValue to _ _ _ Ev1.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev1.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< apply append_nil_output to IsO2.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< apply append_nil_output to IsO3.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< Or: apply is_value_eq_or_not to IsV _ with
V2 = intVal 0.
Subgoal 2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
Or : V = intVal 0 \/ (V = intVal 0 -> false)
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< E: case Or.
Subgoal 2.1:
Variables: FE EE O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F (intVal 0) O3
Ev2 : O2 ++ O3 = O
IsV : is_value (intVal 0)
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< search.
Subgoal 2.2:
Variables: FE EE V O F T C O2 O3
Pr : |{expr}- condExpr C T F ~~> or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))
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 C
H2 : is_expr T
H3 : is_expr F
Ev : evalExpr FE EE C falseVal O2
Ev1 : evalExpr FE EE F V O3
Ev2 : O2 ++ O3 = O
IsV : is_value V
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H4 : O2 ++ [] = O2
H5 : O3 ++ [] = O3
E : V = intVal 0 -> false
============================
exists V',
evalExpr FE EE (or (and (eq C true) (or (eq T (num 0)) true)) (eq F (num 0))) V' O
< search.
Proof completed.
< Prove_Constraint looseEval:host:proj_evalStmt_exists.
Proof completed.
< Prove_Constraint looseEval:host:proj_evalStmt_rel.
Proof completed.
< Prove_Ext_Ind looseEval:host:evalExpr,
looseEval:host:evalArgs,
looseEval:host:evalRecFields,
looseEval:host:evalStmt.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 (condExpr C T F)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< case IsE.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Acc: case Acc.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsN2: apply ext_size_is_int_evalExpr to R3.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsN3: apply ext_size_is_int_evalExpr to R4.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsN4: apply plus_integer_is_integer to _ _ R2.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< L: apply lt_plus_one to R1 _.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply ext_size_pos_evalExpr to R3.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply ext_size_pos_evalExpr to R4.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LEq2: apply lte_left to R2 _ _ _.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LEq3: apply lte_right to R2 _ _ _.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LN2: apply lesseq_less_integer_transitive to LEq2 L.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LN3: apply lesseq_less_integer_transitive to LEq3 L.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< A2: apply Acc to _ LN2.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< A3: apply Acc to _ LN3.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply IH to R3 A2 _ _ _.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply IH to R4 A3 _ _ _.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Ev1: apply drop_ext_size_evalExpr to R3.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Ev2: apply drop_ext_size_evalExpr to R4.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev1.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev2.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply append_nil_output to IsO2.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply append_nil_output to IsO3.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsV: apply evalExpr_isValue to _ _ _ Ev2.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value V
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Or: apply is_value_eq_or_not to IsV _ with
V2 = intVal 0.
Subgoal 1.26:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value V
Or : V = intVal 0 \/ (V = intVal 0 -> false)
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< E: case Or.
Subgoal 1.26.1:
Variables: N FE EE O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) (intVal 0) 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T (intVal 0) O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T (intVal 0) O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T (intVal 0) O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value (intVal 0)
============================
<evalExpr {P}> FE EE (condExpr C T F) (intVal 0) O
< search 20.
Subgoal 1.26.2:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C trueVal O2 N2 **
R4 : <evalExpr {ES}> FE EE T V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C trueVal O2
H7 : <evalExpr {P}> FE EE T V O3
Ev1 : evalExpr FE EE C trueVal O2
Ev2 : evalExpr FE EE T V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value V
E : V = intVal 0 -> false
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< search 20.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 (condExpr C T F)
R1 : 1 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< case IsE.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Acc: case Acc.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsN2: apply ext_size_is_int_evalExpr to R3.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsN3: apply ext_size_is_int_evalExpr to R4.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsN4: apply plus_integer_is_integer to _ _ R2.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< L: apply lt_plus_one to R1 _.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply ext_size_pos_evalExpr to R3.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply ext_size_pos_evalExpr to R4.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LEq2: apply lte_left to R2 _ _ _.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LEq3: apply lte_right to R2 _ _ _.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LN2: apply lesseq_less_integer_transitive to LEq2 L.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< LN3: apply lesseq_less_integer_transitive to LEq3 L.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< A2: apply Acc to _ LN2.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< A3: apply Acc to _ LN3.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply IH to R3 A2 _ _ _.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply IH to R4 A3 _ _ _.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Ev1: apply drop_ext_size_evalExpr to R3.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Ev2: apply drop_ext_size_evalExpr to R4.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsO2: apply evalExpr_isOutput to _ _ _ Ev1.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsO3: apply evalExpr_isOutput to _ _ _ Ev2.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply append_nil_output to IsO2.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< apply append_nil_output to IsO3.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< IsV: apply evalExpr_isValue to _ _ _ Ev2.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value V
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< Or: apply is_value_eq_or_not to IsV _ with
V2 = intVal 0.
Subgoal 1.27:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value V
Or : V = intVal 0 \/ (V = intVal 0 -> false)
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< E: case Or.
Subgoal 1.27.1:
Variables: N FE EE O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) (intVal 0) 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F (intVal 0) O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F (intVal 0) O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F (intVal 0) O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value (intVal 0)
============================
<evalExpr {P}> FE EE (condExpr C T F) (intVal 0) O
< search 20.
Subgoal 1.27.2:
Variables: N FE EE V O N2 N3 N4 O2 O3 F T C
IH : forall N FE EE E V O,
<evalExpr {ES}> FE EE E V 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 O
IH1 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH2 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 O,
<evalExpr {ES}> FE EE E V 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 O
IH5 : forall N FE EE A V O,
<evalArgs {ES}> FE EE A V 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 O
IH6 : forall N FE EE RF V O,
<evalRecFields {ES}> FE EE RF V 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 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 (condExpr C T F) V 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 + N4 = N
R2 : N2 + N3 = N4
R3 : <evalExpr {ES}> FE EE C falseVal O2 N2 **
R4 : <evalExpr {ES}> FE EE F V O3 N3 **
R5 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Acc : forall M, 0 <= M -> M < N -> acc M *
IsN2 : is_integer N2
IsN3 : is_integer N3
IsN4 : is_integer N4
L : N4 < N
H4 : 0 <= N2
H5 : 0 <= N3
LEq2 : N2 <= N4
LEq3 : N3 <= N4
LN2 : N2 < N
LN3 : N3 < N
A2 : acc N2 *
A3 : acc N3 *
H6 : <evalExpr {P}> FE EE C falseVal O2
H7 : <evalExpr {P}> FE EE F V O3
Ev1 : evalExpr FE EE C falseVal O2
Ev2 : evalExpr FE EE F V O3
IsO2 : is_list is_value O2
IsO3 : is_list is_value O3
H8 : O2 ++ [] = O2
H9 : O3 ++ [] = O3
IsV : is_value V
E : V = intVal 0 -> false
============================
<evalExpr {P}> FE EE (condExpr C T F) V O
< search 20.
Proof completed.
< Prove looseEval:host:paramName_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_paramName_forward.
Proof completed.
< Prove_Constraint looseEval:host:proj_paramName_back.
Proof completed.
< Prove looseEval:host:getFunEvalInfo_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_getFunEvalInfo_forward.
Proof completed.
< Prove_Constraint looseEval:host:proj_getFunEvalInfo_back.
Proof completed.
< Prove looseEval:host:evalProgram_unique.
Proof completed.
< Prove_Constraint looseEval:host:proj_evalProgram.
Proof completed.
< Prove_Constraint looseEval:host:proj_evalProgram_back.
Proof completed.
< Prove looseEval:host:evalExpr_typePres,
looseEval:host:evalStmt_typePres,
looseEval:host:evalArgs_typePres,
looseEval:host:evalRecFields_typePres.
Subgoal 1.26:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F)
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 (condExpr C T F) Ty
Ev : evalExpr FE EE (condExpr C T F) V 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 C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
============================
valueType V Ty
< case IsE.
Subgoal 1.26:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F) Ty
Ev : evalExpr FE EE (condExpr C T F) V 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 C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
valueType V Ty
< Ty: case Ty.
Subgoal 1.26:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F) V 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 C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Ty : typeOf FT ET C boolTy
Ty1 : typeOf FT ET T Ty
Ty2 : typeOf FT ET F Ty
============================
valueType V Ty
< apply IH_E to _ _ _ _ _ Ty1 Ev2 _ _.
Subgoal 1.26:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F) V 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 C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Ty : typeOf FT ET C boolTy
Ty1 : typeOf FT ET T Ty
Ty2 : typeOf FT ET F Ty
H4 : valueType V Ty
============================
valueType V Ty
< search.
Subgoal 1.27:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F)
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 (condExpr C T F) Ty
Ev : evalExpr FE EE (condExpr C T F) V 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 C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
============================
valueType V Ty
< case IsE.
Subgoal 1.27:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F) Ty
Ev : evalExpr FE EE (condExpr C T F) V 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 C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
valueType V Ty
< Ty: case Ty.
Subgoal 1.27:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F) V 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 C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Ty : typeOf FT ET C boolTy
Ty1 : typeOf FT ET T Ty
Ty2 : typeOf FT ET F Ty
============================
valueType V Ty
< apply IH_E to _ _ _ _ _ Ty2 Ev2 _ _.
Subgoal 1.27:
Variables: FT ET Ty FE EE O V O2 O3 F T C
IH_E : forall E FT ET Ty FE 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 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_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_A : forall A FT ET Tys FE 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 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_RF : forall RF FT ET FTys FE 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 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 (condExpr C T F) V 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 C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
Ty : typeOf FT ET C boolTy
Ty1 : typeOf FT ET T Ty
Ty2 : typeOf FT ET F Ty
H4 : valueType V Ty
============================
valueType V Ty
< search.
Proof completed.
< Prove looseEval:host:paramTy_paramName_same.
Proof completed.
< Prove looseEval:host:funOK_getFunEvalInfo_related.
Proof completed.
< Prove looseEval:host:evalExpr_output_forms,
looseEval:host:evalStmt_output_forms,
looseEval:host:evalArgs_output_forms,
looseEval:host:evalRecFields_output_forms.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 O * ->
output_forms O
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : output_forms O2
H5 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.26:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C trueVal O2 *
Ev2 : evalExpr FE EE T V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : output_forms O2
H5 : output_forms O3
H6 : output_forms O
============================
output_forms O
< search.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 O * ->
output_forms O
IsE : is_expr (condExpr C T F)
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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
============================
output_forms O
< case IsE.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
============================
output_forms O
< apply IH_E to _ _ _ Ev1.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : output_forms O2
============================
output_forms O
< apply IH_E to _ _ _ Ev2.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : output_forms O2
H5 : output_forms O3
============================
output_forms O
< apply output_forms_append to _ _ Ev3.
Subgoal 1.27:
Variables: FE EE V O O2 O3 F T C
IH_E : forall E FE EE 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 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 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 O * ->
output_forms O
IH_RF : forall RF FE EE Fields 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 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 (condExpr C T F) V O @
Ev1 : evalExpr FE EE C falseVal O2 *
Ev2 : evalExpr FE EE F V O3 *
Ev3 : O2 ++ O3 = O
H1 : is_expr C
H2 : is_expr T
H3 : is_expr F
H4 : output_forms O2
H5 : output_forms O3
H6 : output_forms O
============================
output_forms O
< search.
Proof completed.
< Prove looseEval:host:evalProgram_output_forms.
Proof completed.
< Prove looseEval:host:paramName_exists.
Proof completed.
< Prove looseEval:host:getFunEvalInfo_exists.
Proof completed.