< Module exactEval:ascription.
< Prove_Constraint exactEval:host:proj_expr_unique. Variables: L1 L2 E1 E2 Ty PrA : L1 |{expr}- ascribe E1 Ty ~~> E1 PrB : L2 |{expr}- ascribe E1 Ty ~~> E2 IsE : is_expr (ascribe E1 Ty) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ E1 = E2
< case PrB. Variables: L1 L2 E2 Ty PrA : L1 |{expr}- ascribe E2 Ty ~~> E2 IsE : is_expr (ascribe E2 Ty) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ E2 = E2
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_is. Variables: L E' Ty Pr : L |{expr}- ascribe E' Ty ~~> E' IsE : is_expr (ascribe E' Ty) IsL : is_list is_string L ============================ is_expr E'
< case IsE. Variables: L E' Ty Pr : L |{expr}- ascribe E' Ty ~~> E' IsL : is_list is_string L H1 : is_expr E' H2 : is_typ Ty ============================ is_expr E'
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_other. Variables: L E' L' Ty Pr : L |{expr}- ascribe E' Ty ~~> E' IsE : is_expr (ascribe E' Ty) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists E'', L' |{expr}- ascribe E' Ty ~~> E''
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_is. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_other. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_is. Proof completed.
< Prove_Constraint exactEval:host:proj_param_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_param_is. Proof completed.
< Prove_Constraint exactEval:host:proj_program_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_program_is. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_is. Proof completed.
< Add_Proj_Rel exactEval:host:is_expr, exactEval:host:is_args, exactEval:host:is_recFieldExprs, exactEval:host:is_stmt. Proof completed.
< Prove_Ext_Ind exactEval:host:is_expr, exactEval:host:is_args, exactEval:host:is_recFieldExprs, exactEval:host:is_stmt. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Subgoal 1.21: Variables: Typ Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (ascribe Expr Typ) @ R1 : is_expr Expr * R2 : is_typ Typ ============================ <is_expr {P}> (ascribe Expr Typ)
< apply IH to R1. Subgoal 1.21: Variables: Typ Expr IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_expr (ascribe Expr Typ) @ R1 : is_expr Expr * R2 : is_typ Typ H1 : <is_expr {P}> Expr ============================ <is_expr {P}> (ascribe Expr Typ)
< search. Proof completed.
< Prove exactEval:host:is_args_nilArgs_or_consArgs. Proof completed.
< Prove exactEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs. Proof completed.
< Prove exactEval:host:vars_unique. Subgoal 1.21: Variables: V1 V2 Ty E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 IsE : is_expr (ascribe E1 Ty) VarsA : vars (ascribe E1 Ty) V1 @ VarsB : vars (ascribe E1 Ty) V2 VarsA1 : vars E1 V1 * ============================ V1 = V2
< case IsE. Subgoal 1.21: Variables: V1 V2 Ty E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (ascribe E1 Ty) V1 @ VarsB : vars (ascribe E1 Ty) V2 VarsA1 : vars E1 V1 * H1 : is_expr E1 H2 : is_typ Ty ============================ V1 = V2
< VarsB: case VarsB. Subgoal 1.21: Variables: V1 V2 Ty E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (ascribe E1 Ty) V1 @ VarsA1 : vars E1 V1 * H1 : is_expr E1 H2 : is_typ Ty VarsB : vars E1 V2 ============================ V1 = V2
< apply IH to _ VarsA1 VarsB. Subgoal 1.21: Variables: V2 Ty E1 IH : forall E V1 V2, is_expr E -> vars E V1 * -> vars E V2 -> V1 = V2 IH1 : forall A V1 V2, is_args A -> varsArgs A V1 * -> varsArgs A V2 -> V1 = V2 IH2 : forall RF V1 V2, is_recFieldExprs RF -> varsRecFields RF V1 * -> varsRecFields RF V2 -> V1 = V2 VarsA : vars (ascribe E1 Ty) V2 @ VarsA1 : vars E1 V2 * H1 : is_expr E1 H2 : is_typ Ty VarsB : vars E1 V2 ============================ V2 = V2
< search. Proof completed.
< Prove exactEval:host:vars_is. Subgoal 1.21: Variables: V Ty E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V IsE : is_expr (ascribe E1 Ty) V : vars (ascribe E1 Ty) V @ V1 : vars E1 V * ============================ is_list is_string V
< case IsE. Subgoal 1.21: Variables: V Ty E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (ascribe E1 Ty) V @ V1 : vars E1 V * H1 : is_expr E1 H2 : is_typ Ty ============================ is_list is_string V
< apply IH to _ V1. Subgoal 1.21: Variables: V Ty E1 IH : forall E V, is_expr E -> vars E V * -> is_list is_string V IH1 : forall A V, is_args A -> varsArgs A V * -> is_list is_string V IH2 : forall RF V, is_recFieldExprs RF -> varsRecFields RF V * -> is_list is_string V V : vars (ascribe E1 Ty) V @ V1 : vars E1 V * H1 : is_expr E1 H2 : is_typ Ty H3 : is_list is_string V ============================ is_list is_string V
< search. Proof completed.
< Prove exactEval:host:vars_exist, exactEval:host:varsArgs_exist, exactEval:host:varsRecFields_exist. Subgoal 1.21: Variables: Typ Expr IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (ascribe Expr Typ) @ IsE1 : is_expr Expr * IsE2 : is_typ Typ ============================ exists V, vars (ascribe Expr Typ) V
< apply IH to IsE1. Subgoal 1.21: Variables: Typ Expr V IH : forall E, is_expr E * -> exists V, vars E V IH1 : forall A, is_args A * -> exists V, varsArgs A V IH2 : forall RF, is_recFieldExprs RF * -> exists V, varsRecFields RF V IsE : is_expr (ascribe Expr Typ) @ IsE1 : is_expr Expr * IsE2 : is_typ Typ H1 : vars Expr V ============================ exists V, vars (ascribe Expr Typ) V
< search. Proof completed.
< Prove exactEval:host:stmtNames_is, exactEval:host:stmtNames_isCtx, exactEval:host:exprNames_is. Subgoal 3.22: Variables: Ctx N Ty E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsE : is_expr (ascribe E1 Ty) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (ascribe E1 Ty) N @ EN1 : exprNames Ctx E1 N * ============================ is_list is_string N
< case IsE. Subgoal 3.22: Variables: Ctx N Ty E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (ascribe E1 Ty) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_typ Ty ============================ is_list is_string N
< apply IH_E to _ _ EN1. Subgoal 3.22: Variables: Ctx N Ty E1 IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (ascribe E1 Ty) N @ EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_typ Ty H3 : is_list is_string N ============================ is_list is_string N
< search. Proof completed.
< Prove exactEval:host:stmtNames_unique, exactEval:host:exprNames_unique. Subgoal 2.22: Variables: Ctx NA NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsE : is_expr (ascribe E1 Ty) IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (ascribe E1 Ty) NA @ ENB : exprNames Ctx (ascribe E1 Ty) NB ENA1 : exprNames Ctx E1 NA * ============================ NA = NB
< case IsE. Subgoal 2.22: Variables: Ctx NA NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (ascribe E1 Ty) NA @ ENB : exprNames Ctx (ascribe E1 Ty) NB ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 H2 : is_typ Ty ============================ NA = NB
< ENB: case ENB. Subgoal 2.22: Variables: Ctx NA NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (ascribe E1 Ty) NA @ ENA1 : exprNames Ctx E1 NA * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames Ctx E1 NB ============================ NA = NB
< apply IH_E to _ _ ENA1 ENB. Subgoal 2.22: Variables: Ctx NB Ty E1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) Ctx ENA : exprNames Ctx (ascribe E1 Ty) NB @ ENA1 : exprNames Ctx E1 NB * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames Ctx E1 NB ============================ NB = NB
< search. Proof completed.
< Prove exactEval:host:stmtNames_keep_older. Proof completed.
< Prove exactEval:host:stmtNames_exists, exactEval:host:exprNames_exists, exactEval:host:argsNames_exists, exactEval:host:recFieldNames_exists. Subgoal 2.21: Variables: Ctx Typ Expr IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (ascribe Expr Typ) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * IsE2 : is_typ Typ ============================ exists N, exprNames Ctx (ascribe Expr Typ) N
< apply IH_E to IsE1 IsCtx. Subgoal 2.21: Variables: Ctx Typ Expr N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsE : is_expr (ascribe Expr Typ) @ IsCtx : is_list (is_list is_string) Ctx IsE1 : is_expr Expr * IsE2 : is_typ Typ H1 : exprNames Ctx Expr N ============================ exists N, exprNames Ctx (ascribe Expr Typ) N
< search. Proof completed.
< Prove exactEval:host:stmtNames_not_in_ctx, exactEval:host:exprNames_not_in_ctx. Subgoal 2.22: Variables: Ctx N X Ty E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsE : is_expr (ascribe E1 Ty) IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (ascribe E1 Ty) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * ============================ false
< case IsE. Subgoal 2.22: Variables: Ctx N X Ty E1 IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (ascribe E1 Ty) N @ MemN : mem X N MemsCtx : mems X Ctx EN1 : exprNames Ctx E1 N * H1 : is_expr E1 H2 : is_typ Ty ============================ false
< apply IH_E to _ _ EN1 MemN MemsCtx. Proof completed.
< Prove exactEval:host:stmtNames_relatedCtxs, exactEval:host:stmtNames_relatedCtxs_ctx_fwd, exactEval:host:stmtNames_relatedCtxs_ctx_back, exactEval:host:exprNames_relatedCtxs. Subgoal 4.22: Variables: CtxA CtxB N Ty E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsE : is_expr (ascribe E1 Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (ascribe E1 Ty) N @ EN1 : exprNames CtxA E1 N * ============================ exprNames CtxB (ascribe E1 Ty) N
< case IsE. Subgoal 4.22: Variables: CtxA CtxB N Ty E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (ascribe E1 Ty) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : is_typ Ty ============================ exprNames CtxB (ascribe E1 Ty) N
< apply IH_E to _ _ _ _ _ EN1. Subgoal 4.22: Variables: CtxA CtxB N Ty E1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X, mems X CtxA -> mems X CtxB RelBA : forall X, mems X CtxB -> mems X CtxA EN : exprNames CtxA (ascribe E1 Ty) N @ EN1 : exprNames CtxA E1 N * H1 : is_expr E1 H2 : is_typ Ty H3 : exprNames CtxB E1 N ============================ exprNames CtxB (ascribe E1 Ty) N
< search. Proof completed.
< Prove exactEval:host:stmtNames_increaseCtxs, exactEval:host:stmtNames_increaseCtxs_ctxs, exactEval:host:exprNames_increaseCtxs. Subgoal 3.22: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsE : is_expr (ascribe E1 Ty) IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (ascribe E1 Ty) NA @ ENB : exprNames CtxB (ascribe E1 Ty) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * ============================ mem X NA
< case IsE. Subgoal 3.22: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (ascribe E1 Ty) NA @ ENB : exprNames CtxB (ascribe E1 Ty) NB M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_typ Ty ============================ mem X NA
< ENB: case ENB. Subgoal 3.22: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (ascribe E1 Ty) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames CtxB E1 NB ============================ mem X NA
< apply IH_E to _ _ _ _ ENA1 ENB M. Subgoal 3.22: Variables: CtxA NA CtxB NB X Ty E1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) CtxA IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA -> mems X1 CtxB ENA : exprNames CtxA (ascribe E1 Ty) NA @ M : mem X NB ENA1 : exprNames CtxA E1 NA * H1 : is_expr E1 H2 : is_typ Ty ENB : exprNames CtxB E1 NB H3 : mem X NA ============================ mem X NA
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_exprNames. Variables: Names E_P Ctx N N_P X Ty Pr : Names |{expr}- ascribe E_P Ty ~~> E_P IsE : is_expr (ascribe E_P Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN : exprNames Ctx (ascribe E_P Ty) N EN_P : exprNames Ctx E_P N_P M : mem X N_P ============================ mem X N
< EN: case EN. Variables: Names E_P Ctx N N_P X Ty Pr : Names |{expr}- ascribe E_P Ty ~~> E_P IsE : is_expr (ascribe E_P Ty) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx E_P N_P M : mem X N_P EN : exprNames Ctx E_P N ============================ mem X N
< case IsE. Variables: Names E_P Ctx N N_P X Ty Pr : Names |{expr}- ascribe E_P Ty ~~> E_P IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx E_P N_P M : mem X N_P EN : exprNames Ctx E_P N H1 : is_expr E_P H2 : is_typ Ty ============================ mem X N
< apply exprNames_unique to _ _ EN_P EN. Variables: Names E_P Ctx N X Ty Pr : Names |{expr}- ascribe E_P Ty ~~> E_P IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) Ctx EN_P : exprNames Ctx E_P N M : mem X N EN : exprNames Ctx E_P N H1 : is_expr E_P H2 : is_typ Ty ============================ mem X N
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_backward. Proof completed.
< Prove exactEval:host:typeOf_isTy, exactEval:host:stmtOK_isCtx. Subgoal 1.23: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsE : is_expr (ascribe E1 Ty) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (ascribe E1 Ty) Ty @ Ty1 : typeOf FT ET E1 Ty * ============================ is_typ Ty
< case IsE. Subgoal 1.23: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (ascribe E1 Ty) Ty @ Ty1 : typeOf FT ET E1 Ty * H1 : is_expr E1 H2 : is_typ Ty ============================ is_typ Ty
< apply IH to _ _ _ Ty1. Subgoal 1.23: Variables: FT ET Ty E1 IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET Ty : typeOf FT ET (ascribe E1 Ty) Ty @ Ty1 : typeOf FT ET E1 Ty * H1 : is_expr E1 H2 : is_typ Ty H3 : is_typ Ty ============================ is_typ Ty
< search. Proof completed.
< Prove exactEval:host:stmtOK_keep_scopes. Proof completed.
< Prove exactEval:host:stmtOK_older_scopes_same. Proof completed.
< Prove exactEval:host:stmtOK_first_scope_lookup_same. Proof completed.
< Prove exactEval:host:typeOf_unique, exactEval:host:stmtOK_unique. Subgoal 1.23: Variables: FT ET_A ET_B TyA TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsE : is_expr (ascribe E1 TyA) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (ascribe E1 TyA) TyA @ TyB : typeOf FT ET_B (ascribe E1 TyA) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 TyA * ============================ TyA = TyB
< case IsE. Subgoal 1.23: Variables: FT ET_A ET_B TyA TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (ascribe E1 TyA) TyA @ TyB : typeOf FT ET_B (ascribe E1 TyA) TyB Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 TyA * H1 : is_expr E1 H2 : is_typ TyA ============================ TyA = TyB
< TyB: case TyB. Subgoal 1.23: Variables: FT ET_A ET_B TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (ascribe E1 TyB) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 TyB * H1 : is_expr E1 H2 : is_typ TyB TyB : typeOf FT ET_B E1 TyB ============================ TyB = TyB
< apply IH_E to _ _ _ _ TyA1 TyB _. Subgoal 1.23: Variables: FT ET_A ET_B TyB E1 IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : typeOf FT ET_A (ascribe E1 TyB) TyB @ Lkp : lookup_all_scopes ET_A ET_B TyA1 : typeOf FT ET_A E1 TyB * H1 : is_expr E1 H2 : is_typ TyB TyB : typeOf FT ET_B E1 TyB ============================ TyB = TyB
< search. Proof completed.
< Prove exactEval:host:paramTy_is. Proof completed.
< Prove exactEval:host:getFunInfo_is. Proof completed.
< Prove exactEval:host:paramTy_exists. Proof completed.
< Prove exactEval:host:getFunInfo_exists. Proof completed.
< Prove exactEval:host:evalExpr_isCtx, exactEval:host:evalExpr_isValue, exactEval:host:evalStmt_isCtx, exactEval:host:evalArgs_isCtx, exactEval:host:evalArgs_isValue, exactEval:host:evalRecFields_isCtx, exactEval:host:evalRecFields_isValue. Subgoal 1.27: Variables: FE EE EE' V O Ty E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsE. Subgoal 1.27: Variables: FE EE EE' V O Ty E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE EE' V O Ty E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Subgoal 2.27: Variables: FE EE EE' V O Ty E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * ============================ is_value V
< case IsE. Subgoal 2.27: Variables: FE EE EE' V O Ty E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty ============================ is_value V
< apply IH_V_E to _ _ _ Ev1. Subgoal 2.27: Variables: FE EE EE' V O Ty E1 IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty H3 : is_value V ============================ is_value V
< search. Proof completed.
< Prove exactEval:host:evalExpr_isOutput, exactEval:host:evalStmt_isOutput, exactEval:host:evalArgs_isOutput, exactEval:host:evalRecFields_isOutput. Subgoal 1.27: Variables: FE EE EE' V O Ty E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * ============================ is_list is_value O
< case IsE. Subgoal 1.27: Variables: FE EE EE' V O Ty E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE EE' V O Ty E1 IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty H3 : is_list is_value O ============================ is_list is_value O
< search. Proof completed.
< Prove exactEval:host:paramName_is. Proof completed.
< Prove exactEval:host:getFunEvalInfo_is. Proof completed.
< Prove exactEval:host:evalProgram_isOutput. Proof completed.
< Prove exactEval:host:evalExpr_names_same, exactEval:host:evalStmt_names_same, exactEval:host:evalArgs_names_same, exactEval:host:evalRecFields_names_same. Subgoal 1.27: Variables: FE EE V EE' O Ty E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * ============================ names_same EE EE'
< case IsE. Subgoal 1.27: Variables: FE EE V EE' O Ty E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty ============================ names_same EE EE'
< apply IH_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O Ty E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty H3 : names_same EE EE' ============================ names_same EE EE'
< search. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes, exactEval:host:evalExpr_newNameScopes_output, exactEval:host:evalExpr_newNameScopes_ctx, exactEval:host:evalStmt_newNameScopes_output, exactEval:host:evalStmt_newNameScopes, exactEval:host:evalArgs_newNameScopes, exactEval:host:evalArgs_newNameScopes_output, exactEval:host:evalArgs_newNameScopes_ctx, exactEval:host:evalRecFields_newNameScopes, exactEval:host:evalRecFields_newNameScopes_output, exactEval:host:evalRecFields_newNameScopes_ctx. Subgoal 1.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * ============================ VA = VB
< case IsE. Subgoal 1.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty ============================ VA = VB
< EvB: case EvB. Subgoal 1.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' O_B ============================ VA = VB
< apply IH_V_E to _ _ _ _ EvA1 EvB _. Subgoal 1.27: Variables: FE EE_A EE_B VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VB EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VB EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' O_B ============================ VB = VB
< search. Subgoal 2.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * ============================ O_A = O_B
< case IsE. Subgoal 2.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty ============================ O_A = O_B
< EvB: case EvB. Subgoal 2.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 2.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_B * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' O_B ============================ O_B = O_B
< search. Subgoal 3.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsE. Subgoal 3.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 3.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 3.27: Variables: FE EE_A EE_B VA VB EE_A' EE_B' O_A O_B N Len Ty E1 IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 VA EE_A' O_A * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' O_B H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Proof completed.
< Add_Ext_Size exactEval:host:evalExpr, exactEval:host:evalStmt, exactEval:host:evalArgs, exactEval:host:evalRecFields. Proof completed.
< Add_Proj_Rel exactEval:host:evalExpr, exactEval:host:evalStmt, exactEval:host:evalArgs, exactEval:host:evalRecFields. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes_exists_ES, exactEval:host:evalStmt_newNameScopes_exists_ES, exactEval:host:evalArgs_newNameScopes_exists_ES, exactEval:host:evalRecFields_newNameScopes_exists_ES. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Ty E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (ascribe E1 Ty) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V EE_B' O N2 * ============================ exists EE_A', <evalExpr {ES}> FE EE_A (ascribe E1 Ty) V EE_A' O ES
< case IsE. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Ty E1 IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (ascribe E1 Ty) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V EE_B' O N2 * H1 : is_expr E1 H2 : is_typ Ty ============================ exists EE_A', <evalExpr {ES}> FE EE_A (ascribe E1 Ty) V EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 NNS. Subgoal 1.27: Variables: FE EE_A EE_B V EE_B' O N Len ES N2 Ty E1 EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B EvB : <evalExpr {ES}> FE EE_B (ascribe E1 Ty) V EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE EE_B E1 V EE_B' O N2 * H1 : is_expr E1 H2 : is_typ Ty H3 : <evalExpr {ES}> FE EE_A E1 V EE_A' O N2 ============================ exists EE_A', <evalExpr {ES}> FE EE_A (ascribe E1 Ty) V EE_A' O ES
< search. Proof completed.
< Prove exactEval:host:evalExpr_ctx_names, exactEval:host:evalStmt_ctx_names, exactEval:host:evalArgs_ctx_names, exactEval:host:evalRecFields_ctx_names. Subgoal 1.27: Variables: FE EE V EE' O Ctx N Ty E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E1 Ty) N Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * ============================ ctx_names EE' Ctx
< case IsE. Subgoal 1.27: Variables: FE EE V EE' O Ctx N Ty E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E1 Ty) N Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty ============================ ctx_names EE' Ctx
< EN: case EN. Subgoal 1.27: Variables: FE EE V EE' O Ctx N Ty E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty EN : exprNames Ctx E1 N ============================ ctx_names EE' Ctx
< apply IH_E to _ _ _ _ Ctxs EN Ev1. Subgoal 1.27: Variables: FE EE V EE' O Ctx N Ty E1 IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty EN : exprNames Ctx E1 N H3 : ctx_names EE' Ctx ============================ ctx_names EE' Ctx
< search. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes_exists_back, exactEval:host:evalStmt_newNameScopes_exists_back, exactEval:host:evalArgs_newNameScopes_exists_back, exactEval:host:evalRecFields_newNameScopes_exists_back. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (ascribe E1 Ty) [] EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< case IsE. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EN : exprNames Ctx (ascribe E1 Ty) [] EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O * H1 : is_expr E1 H2 : is_typ Ty ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< EN: case EN. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1 IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O * H1 : is_expr E1 H2 : is_typ Ty EN : exprNames Ctx E1 [] ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs EN EvA1 NNS. Subgoal 1.27: Variables: FE EE_A EE_B V Ctx EE_A' O N Len Ty E1 EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE_B Ctx EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE EE_A E1 V EE_A' O * H1 : is_expr E1 H2 : is_typ Ty EN : exprNames Ctx E1 [] H3 : evalExpr FE EE_B E1 V EE_B' O ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< search. Proof completed.
< Prove exactEval:host:evalExpr_scopes_same, exactEval:host:evalExpr_scopes_same_ctx, exactEval:host:evalStmt_scopes_same, exactEval:host:evalStmt_scopes_same_ctx, exactEval:host:evalArgs_scopes_same, exactEval:host:evalArgs_scopes_same_ctx, exactEval:host:evalRecFields_scopes_same, exactEval:host:evalRecFields_scopes_same_ctx. Subgoal 1.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * ============================ VA = VB /\ OA = OB
< case IsE. Subgoal 1.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * H1 : is_expr E1 H2 : is_typ Ty ============================ VA = VB /\ OA = OB
< EvB: case EvB. Subgoal 1.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' OB ============================ VA = VB /\ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 1.27: Variables: FE EE_A EE_A' EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VB EE_A' OB @ EvA1 : evalExpr FE EE_A E1 VB EE_A' OB * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' OB ============================ VB = VB /\ OB = OB
< search. Subgoal 2.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsE. Subgoal 2.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvB : evalExpr FE EE_B (ascribe E1 Ty) VB EE_B' OB EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * H1 : is_expr E1 H2 : is_typ Ty ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 2.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ SS EvA1 EvB. Subgoal 2.27: Variables: FE EE_A VA EE_A' OA EE_B VB EE_B' OB Ty E1 IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) VA EE_A' OA @ EvA1 : evalExpr FE EE_A E1 VA EE_A' OA * H1 : is_expr E1 H2 : is_typ Ty EvB : evalExpr FE EE_B E1 VB EE_B' OB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Proof completed.
< Prove exactEval:host:evalExpr_scopes_same_exists, exactEval:host:evalStmt_scopes_same_exists, exactEval:host:evalArgs_scopes_same_exists, exactEval:host:evalRecFields_scopes_same_exists. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B Ty E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 V EE_A' O * ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< case IsE. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B Ty E1 IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 V EE_A' O * H1 : is_expr E1 H2 : is_typ Ty ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 1.27: Variables: FE EE_A V EE_A' O EE_B Ty E1 EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalExpr FE EE_A (ascribe E1 Ty) V EE_A' O @ EvA1 : evalExpr FE EE_A E1 V EE_A' O * H1 : is_expr E1 H2 : is_typ Ty H3 : evalExpr FE EE_B E1 V EE_B' O ============================ exists EE_B', evalExpr FE EE_B (ascribe E1 Ty) V EE_B' O
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_forward. Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsE : is_expr (ascribe E' Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E' Ty) V EE' O ============================ exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''
< case IsE. Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E' Ty) V EE' O H1 : is_expr E' H2 : is_typ Ty ============================ exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E' H2 : is_typ Ty Ev : evalExpr FE EE E' V EE' O ============================ exists EE'', evalExpr FE EE E' V EE'' O /\ scopes_same EE' EE''
< exists EE'. Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E' H2 : is_typ Ty Ev : evalExpr FE EE E' V EE' O ============================ evalExpr FE EE E' V EE' O /\ scopes_same EE' EE'
< split. Subgoal 1: Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E' H2 : is_typ Ty Ev : evalExpr FE EE E' V EE' O ============================ evalExpr FE EE E' V EE' O
< search. Subgoal 2: Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E' H2 : is_typ Ty Ev : evalExpr FE EE E' V EE' O ============================ scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names E' FE EE V EE' O Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E' H2 : is_typ Ty Ev : evalExpr FE EE E' V EE' O H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_backward. Variables: Names E' FE EE V EE' O Ctx Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsE : is_expr (ascribe E' Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E' Ty) [] Ev : evalExpr FE EE E' V EE' O ============================ exists EE'', evalExpr FE EE (ascribe E' Ty) V EE'' O /\ scopes_same EE' EE''
< case IsE. Variables: Names E' FE EE V EE' O Ctx Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E' Ty) [] Ev : evalExpr FE EE E' V EE' O H1 : is_expr E' H2 : is_typ Ty ============================ exists EE'', evalExpr FE EE (ascribe E' Ty) V EE'' O /\ scopes_same EE' EE''
< exists EE'. Variables: Names E' FE EE V EE' O Ctx Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E' Ty) [] Ev : evalExpr FE EE E' V EE' O H1 : is_expr E' H2 : is_typ Ty ============================ evalExpr FE EE (ascribe E' Ty) V EE' O /\ scopes_same EE' EE'
< split. Subgoal 1: Variables: Names E' FE EE V EE' O Ctx Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E' Ty) [] Ev : evalExpr FE EE E' V EE' O H1 : is_expr E' H2 : is_typ Ty ============================ evalExpr FE EE (ascribe E' Ty) V EE' O
< search. Subgoal 2: Variables: Names E' FE EE V EE' O Ctx Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E' Ty) [] Ev : evalExpr FE EE E' V EE' O H1 : is_expr E' H2 : is_typ Ty ============================ scopes_same EE' EE'
< apply evalExpr_isCtx to _ _ _ Ev. Subgoal 2: Variables: Names E' FE EE V EE' O Ctx Ty Pr : Names |{expr}- ascribe E' Ty ~~> E' Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx EN : exprNames Ctx (ascribe E' Ty) [] Ev : evalExpr FE EE E' V EE' O H1 : is_expr E' H2 : is_typ Ty H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ scopes_same EE' EE'
< backchain scopes_same_reflexive. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_backward. Proof completed.
< Prove_Ext_Ind exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsE : is_expr (ascribe E1 Ty) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< case IsE. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< apply ext_size_is_int_evalExpr to R2. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< L: apply lt_plus_one to R1 _. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 L : N2 < N ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< Acc: case Acc. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 L : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< apply ext_size_pos_evalExpr to R2. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 L : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N2 ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< A: apply Acc to _ L. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 L : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N2 A : acc N2 * ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< apply IH to R2 A _ _ _. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 L : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E1 V EE' O ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< Names: apply names_exists to IsEE. Subgoal 1.27: Variables: N FE EE V EE' O N2 Ty E1 N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalExpr {ES}> FE EE (ascribe E1 Ty) V EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E1 V EE' O N2 ** H1 : is_expr E1 H2 : is_typ Ty H3 : is_integer N2 L : N2 < N Acc : forall M, 0 <= M -> M < N -> acc M * H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E1 V EE' O Names : names EE N1 ============================ <evalExpr {P}> FE EE (ascribe E1 Ty) V EE' O
< search. Proof completed.
< Prove exactEval:host:paramName_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_back. Proof completed.
< Prove exactEval:host:getFunEvalInfo_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_back. Proof completed.
< Prove exactEval:host:evalProgram_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_evalProgram_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalProgram_back. Proof completed.
< Prove exactEval:host:evalExpr_typePres_ctx, exactEval:host:evalExpr_typePres, exactEval:host:evalStmt_typePres, exactEval:host:evalArgs_typePres_Ctx, exactEval:host:evalArgs_typePres, exactEval:host:evalRecFields_typePres_Ctx, exactEval:host:evalRecFields_typePres. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V Ty1 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (ascribe E1 Ty1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (ascribe E1 Ty1) Ty Ev : evalExpr FE EE (ascribe E1 Ty1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * ============================ related_all_scopes ET EE'
< case IsE. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V Ty1 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (ascribe E1 Ty1) Ty Ev : evalExpr FE EE (ascribe E1 Ty1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty1 ============================ related_all_scopes ET EE'
< Ty: case Ty. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty Ty : typeOf FT ET E1 Ty ============================ related_all_scopes ET EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 1.27: Variables: FT ET Ty FE EE EE' O V E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty Ty : typeOf FT ET E1 Ty H3 : related_all_scopes ET EE' ============================ related_all_scopes ET EE'
< search. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V Ty1 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsE : is_expr (ascribe E1 Ty1) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (ascribe E1 Ty1) Ty Ev : evalExpr FE EE (ascribe E1 Ty1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * ============================ valueType V Ty
< case IsE. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V Ty1 E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : typeOf FT ET (ascribe E1 Ty1) Ty Ev : evalExpr FE EE (ascribe E1 Ty1) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty1 ============================ valueType V Ty
< Ty: case Ty. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty Ty : typeOf FT ET E1 Ty ============================ valueType V Ty
< apply IH_T_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 2.27: Variables: FT ET Ty FE EE EE' O V E1 IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty Ty : typeOf FT ET E1 Ty H3 : valueType V Ty ============================ valueType V Ty
< search. Proof completed.
< Prove exactEval:host:paramTy_paramName_same. Proof completed.
< Prove exactEval:host:funOK_getFunEvalInfo_related. Proof completed.
< Prove exactEval:host:evalExpr_output_forms, exactEval:host:evalStmt_output_forms, exactEval:host:evalArgs_output_forms, exactEval:host:evalRecFields_output_forms. Subgoal 1.27: Variables: FE EE V EE' O Ty E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsE : is_expr (ascribe E1 Ty) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * ============================ output_forms O
< case IsE. Subgoal 1.27: Variables: FE EE V EE' O Ty E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 1.27: Variables: FE EE V EE' O Ty E1 IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalExpr FE EE (ascribe E1 Ty) V EE' O @ Ev1 : evalExpr FE EE E1 V EE' O * H1 : is_expr E1 H2 : is_typ Ty H3 : output_forms O ============================ output_forms O
< search. Proof completed.
< Prove exactEval:host:evalProgram_output_forms. Proof completed.
< Prove exactEval:host:paramName_exists. Proof completed.
< Prove exactEval:host:getFunEvalInfo_exists. Proof completed.