< Module exactEval:assert.
< Prove_Constraint exactEval:host:proj_expr_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_is. Proof completed.
< Prove_Constraint exactEval:host:proj_expr_other. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_unique. Variables: L1 L2 S2 Msg E PrA : L1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) PrB : L2 |{stmt}- assert E Msg ~~> S2 IsS : is_stmt (assert E Msg) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ ifThenElse E noop (printVal (errorExpr Msg intTy)) = S2
< case PrB. Variables: L1 L2 Msg E PrA : L1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsS : is_stmt (assert E Msg) IsL1 : is_list is_string L1 IsL2 : is_list is_string L2 Rel12 : forall X, mem X L1 -> mem X L2 Rel21 : forall X, mem X L2 -> mem X L1 ============================ ifThenElse E noop (printVal (errorExpr Msg intTy)) = ifThenElse E noop (printVal (errorExpr Msg intTy))
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_is. Variables: L Msg E Pr : L |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsS : is_stmt (assert E Msg) IsL : is_list is_string L ============================ is_stmt (ifThenElse E noop (printVal (errorExpr Msg intTy)))
< case IsS. Variables: L Msg E Pr : L |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsL : is_list is_string L H1 : is_expr E H2 : is_expr Msg ============================ is_stmt (ifThenElse E noop (printVal (errorExpr Msg intTy)))
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmt_other. Variables: L L' Msg E Pr : L |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsS : is_stmt (assert E Msg) IsL : is_list is_string L IsL' : is_list is_string L' ============================ exists S'', L' |{stmt}- assert E Msg ~~> S''
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_fun_is. Proof completed.
< Prove_Constraint exactEval:host:proj_param_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_param_is. Proof completed.
< Prove_Constraint exactEval:host:proj_program_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_program_is. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_typ_is. Proof completed.
< Add_Proj_Rel exactEval:host:is_expr, exactEval:host:is_args, exactEval:host:is_recFieldExprs, exactEval:host:is_stmt. Proof completed.
< Prove_Ext_Ind exactEval:host:is_expr, exactEval:host:is_args, exactEval:host:is_recFieldExprs, exactEval:host:is_stmt. Warning: No definition of Ext Size for all relations in Ext Ind; defaulting to proving Ext Ind without Ext Size Subgoal 4.10: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (assert Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * ============================ <is_stmt {P}> (assert Expr1 Expr)
< apply IH to R1. Subgoal 4.10: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (assert Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 ============================ <is_stmt {P}> (assert Expr1 Expr)
< apply IH to R2. Subgoal 4.10: Variables: Expr Expr1 IH : forall E, is_expr E * -> <is_expr {P}> E IH1 : forall A, is_args A * -> <is_args {P}> A IH2 : forall RF, is_recFieldExprs RF * -> <is_recFieldExprs {P}> RF IH3 : forall S, is_stmt S * -> <is_stmt {P}> S R : is_stmt (assert Expr1 Expr) @ R1 : is_expr Expr1 * R2 : is_expr Expr * H1 : <is_expr {P}> Expr1 H2 : <is_expr {P}> Expr ============================ <is_stmt {P}> (assert Expr1 Expr)
< search. Proof completed.
< Prove exactEval:host:is_args_nilArgs_or_consArgs. Proof completed.
< Prove exactEval:host:is_recFieldExprs_nilRecFieldExprs_or_consRecFieldExprs. Proof completed.
< Prove exactEval:host:vars_unique. Proof completed.
< Prove exactEval:host:vars_is. Proof completed.
< Prove exactEval:host:vars_exist, exactEval:host:varsArgs_exist, exactEval:host:varsRecFields_exist. Proof completed.
< Prove exactEval:host:stmtNames_is, exactEval:host:stmtNames_isCtx, exactEval:host:exprNames_is. Subgoal 1.12: Variables: N Ctx' NE NM Msg E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (assert E Msg) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assert E Msg) N Ctx' @ SN1 : exprNames Ctx' E NE * SN2 : exprNames Ctx' Msg NM * SN3 : NE ++ NM = N ============================ is_list is_string N
< case IsS. Subgoal 1.12: Variables: N Ctx' NE NM Msg E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assert E Msg) N Ctx' @ SN1 : exprNames Ctx' E NE * SN2 : exprNames Ctx' Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg ============================ is_list is_string N
< apply IH_E to _ _ SN1. Subgoal 1.12: Variables: N Ctx' NE NM Msg E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assert E Msg) N Ctx' @ SN1 : exprNames Ctx' E NE * SN2 : exprNames Ctx' Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg H3 : is_list is_string NE ============================ is_list is_string N
< apply IH_E to _ _ SN2. Subgoal 1.12: Variables: N Ctx' NE NM Msg E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assert E Msg) N Ctx' @ SN1 : exprNames Ctx' E NE * SN2 : exprNames Ctx' Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg H3 : is_list is_string NE H4 : is_list is_string NM ============================ is_list is_string N
< apply append_list_string_is to _ _ SN3. Subgoal 1.12: Variables: N Ctx' NE NM Msg E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assert E Msg) N Ctx' @ SN1 : exprNames Ctx' E NE * SN2 : exprNames Ctx' Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg H3 : is_list is_string NE H4 : is_list is_string NM H5 : is_list is_string N ============================ is_list is_string N
< search. Subgoal 2.12: Variables: N Ctx' NE NM Msg E IH_S : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list is_string N IH_S_C : forall Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S N Ctx' * -> is_list (is_list is_string) Ctx' IH_E : forall Ctx E N, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> is_list is_string N IH_A : forall Ctx A N, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> is_list is_string N IH_RF : forall Ctx RF N, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> is_list is_string N IsS : is_stmt (assert E Msg) IsCtx : is_list (is_list is_string) Ctx' SN : stmtNames Ctx' (assert E Msg) N Ctx' @ SN1 : exprNames Ctx' E NE * SN2 : exprNames Ctx' Msg NM * SN3 : NE ++ NM = N ============================ is_list (is_list is_string) Ctx'
< search. Proof completed.
< Prove exactEval:host:stmtNames_unique, exactEval:host:exprNames_unique. Subgoal 1.12: Variables: NA CtxA NB CtxB NE NM Msg E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsS : is_stmt (assert E Msg) IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (assert E Msg) NA CtxA @ SNB : stmtNames CtxA (assert E Msg) NB CtxB SNA1 : exprNames CtxA E NE * SNA2 : exprNames CtxA Msg NM * SNA3 : NE ++ NM = NA ============================ NA = NB /\ CtxA = CtxB
< case IsS. Subgoal 1.12: Variables: NA CtxA NB CtxB NE NM Msg E IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxA SNA : stmtNames CtxA (assert E Msg) NA CtxA @ SNB : stmtNames CtxA (assert E Msg) NB CtxB SNA1 : exprNames CtxA E NE * SNA2 : exprNames CtxA Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg ============================ NA = NB /\ CtxA = CtxB
< SNB: case SNB. Subgoal 1.12: Variables: NA NB CtxB NE NM Msg E NE1 NM1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assert E Msg) NA CtxB @ SNA1 : exprNames CtxB E NE * SNA2 : exprNames CtxB Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames CtxB E NE1 SNB1 : exprNames CtxB Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA1 SNB. Subgoal 1.12: Variables: NA NB CtxB NM Msg E NE1 NM1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assert E Msg) NA CtxB @ SNA1 : exprNames CtxB E NE1 * SNA2 : exprNames CtxB Msg NM * SNA3 : NE1 ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames CtxB E NE1 SNB1 : exprNames CtxB Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply IH_E to _ _ SNA2 SNB1. Subgoal 1.12: Variables: NA NB CtxB Msg E NE1 NM1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assert E Msg) NA CtxB @ SNA1 : exprNames CtxB E NE1 * SNA2 : exprNames CtxB Msg NM1 * SNA3 : NE1 ++ NM1 = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames CtxB E NE1 SNB1 : exprNames CtxB Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ NA = NB /\ CtxB = CtxB
< apply append_unique to SNA3 SNB2. Subgoal 1.12: Variables: NB CtxB Msg E NE1 NM1 IH_S : forall Ctx S NA CtxA NB CtxB, is_stmt S -> is_list (is_list is_string) Ctx -> stmtNames Ctx S NA CtxA * -> stmtNames Ctx S NB CtxB -> NA = NB /\ CtxA = CtxB IH_E : forall Ctx E NA NB, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E NA * -> exprNames Ctx E NB -> NA = NB IH_A : forall Ctx A NA NB, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A NA * -> argsNames Ctx A NB -> NA = NB IH_RF : forall Ctx RF NA NB, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF NA * -> recFieldNames Ctx RF NB -> NA = NB IsCtx : is_list (is_list is_string) CtxB SNA : stmtNames CtxB (assert E Msg) NB CtxB @ SNA1 : exprNames CtxB E NE1 * SNA2 : exprNames CtxB Msg NM1 * SNA3 : NE1 ++ NM1 = NB H1 : is_expr E H2 : is_expr Msg SNB : exprNames CtxB E NE1 SNB1 : exprNames CtxB Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ NB = NB /\ CtxB = CtxB
< search. Proof completed.
< Prove exactEval:host:stmtNames_keep_older. Subgoal 12: Variables: Scope Ctx N NE NM Msg E IH : forall Scope Ctx S N Ctx', is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> exists Scope', Ctx' = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope') IsS : is_stmt (assert E Msg) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @ SN1 : exprNames (Scope::Ctx) E NE * SN2 : exprNames (Scope::Ctx) Msg NM * SN3 : NE ++ NM = N ============================ exists Scope', Scope::Ctx = Scope'::Ctx /\ (forall X, mem X Scope -> mem X Scope')
< search. Proof completed.
< Prove exactEval:host:stmtNames_exists, exactEval:host:exprNames_exists, exactEval:host:argsNames_exists, exactEval:host:recFieldNames_exists. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assert Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr1 * IsS2 : is_expr Expr * ============================ exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
< ENE: apply IH_E to IsS1 IsCtx. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 N IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assert Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr1 * IsS2 : is_expr Expr * ENE : exprNames (Scope::Ctx) Expr1 N ============================ exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
< ENM: apply IH_E to IsS2 IsCtx. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assert Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr1 * IsS2 : is_expr Expr * ENE : exprNames (Scope::Ctx) Expr1 N ENM : exprNames (Scope::Ctx) Expr N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
< Is1: apply exprNames_is to _ _ ENE. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assert Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr1 * IsS2 : is_expr Expr * ENE : exprNames (Scope::Ctx) Expr1 N ENM : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N ============================ exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
< Is2: apply exprNames_is to _ _ ENM. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 N N1 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assert Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr1 * IsS2 : is_expr Expr * ENE : exprNames (Scope::Ctx) Expr1 N ENM : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 ============================ exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
< apply append_list_string_total to Is1 Is2. Subgoal 1.10: Variables: Scope Ctx Expr Expr1 N N1 L3 IH_S : forall Scope Ctx S, is_stmt S * -> is_list (is_list is_string) (Scope::Ctx) -> exists N Ctx', stmtNames (Scope::Ctx) S N Ctx' IH_E : forall Ctx E, is_expr E * -> is_list (is_list is_string) Ctx -> exists N, exprNames Ctx E N IH_A : forall Ctx A, is_args A * -> is_list (is_list is_string) Ctx -> exists N, argsNames Ctx A N IH_RF : forall Ctx RF, is_recFieldExprs RF * -> is_list (is_list is_string) Ctx -> exists N, recFieldNames Ctx RF N IsS : is_stmt (assert Expr1 Expr) @ IsCtx : is_list (is_list is_string) (Scope::Ctx) IsS1 : is_expr Expr1 * IsS2 : is_expr Expr * ENE : exprNames (Scope::Ctx) Expr1 N ENM : exprNames (Scope::Ctx) Expr N1 Is1 : is_list is_string N Is2 : is_list is_string N1 H1 : N ++ N1 = L3 ============================ exists N Ctx', stmtNames (Scope::Ctx) (assert Expr1 Expr) N Ctx'
< search. Proof completed.
< Prove exactEval:host:stmtNames_not_in_ctx, exactEval:host:exprNames_not_in_ctx. Subgoal 1.12: Variables: Scope Ctx N X NE NM Msg E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsS : is_stmt (assert E Msg) IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E NE * SN2 : exprNames (Scope::Ctx) Msg NM * SN3 : NE ++ NM = N ============================ false
< case IsS. Subgoal 1.12: Variables: Scope Ctx N X NE NM Msg E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E NE * SN2 : exprNames (Scope::Ctx) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg ============================ false
< Or: apply mem_append to MemN SN3. Subgoal 1.12: Variables: Scope Ctx N X NE NM Msg E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E NE * SN2 : exprNames (Scope::Ctx) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg Or : mem X NE \/ mem X NM ============================ false
< M: case Or. Subgoal 1.12.1: Variables: Scope Ctx N X NE NM Msg E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E NE * SN2 : exprNames (Scope::Ctx) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg M : mem X NE ============================ false
< apply IH_E to _ _ SN1 M MemsCtx. Subgoal 1.12.2: Variables: Scope Ctx N X NE NM Msg E IH_S : forall Scope Ctx S N Ctx' X, is_stmt S -> is_list (is_list is_string) (Scope::Ctx) -> stmtNames (Scope::Ctx) S N Ctx' * -> mem X N -> mems X (Scope::Ctx) -> false IH_E : forall Ctx E N X, is_expr E -> is_list (is_list is_string) Ctx -> exprNames Ctx E N * -> mem X N -> mems X Ctx -> false IH_A : forall Ctx A N X, is_args A -> is_list (is_list is_string) Ctx -> argsNames Ctx A N * -> mem X N -> mems X Ctx -> false IH_RF : forall Ctx RF N X, is_recFieldExprs RF -> is_list (is_list is_string) Ctx -> recFieldNames Ctx RF N * -> mem X N -> mems X Ctx -> false IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N (Scope::Ctx) @ MemN : mem X N MemsCtx : mems X (Scope::Ctx) SN1 : exprNames (Scope::Ctx) E NE * SN2 : exprNames (Scope::Ctx) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg M : mem X NM ============================ false
< apply IH_E to _ _ SN2 M MemsCtx. Proof completed.
< Prove exactEval:host:stmtNames_relatedCtxs, exactEval:host:stmtNames_relatedCtxs_ctx_fwd, exactEval:host:stmtNames_relatedCtxs_ctx_back, exactEval:host:exprNames_relatedCtxs. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E NE * SN2 : exprNames (ScopeA::CtxA) Msg NM * SN3 : NE ++ NM = N ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
< case IsS. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E NE * SN2 : exprNames (ScopeA::CtxA) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN1. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E NE * SN2 : exprNames (ScopeA::CtxA) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg H3 : exprNames (ScopeB::CtxB) E NE ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
< apply IH_E to _ _ _ RelAB RelBA SN2. Subgoal 1.12: Variables: ScopeA CtxA N ScopeB CtxB NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB) RelBA : forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA) SN : stmtNames (ScopeA::CtxA) (assert E Msg) N (ScopeA::CtxA) @ SN1 : exprNames (ScopeA::CtxA) E NE * SN2 : exprNames (ScopeA::CtxA) Msg NM * SN3 : NE ++ NM = N H1 : is_expr E H2 : is_expr Msg H3 : exprNames (ScopeB::CtxB) E NE H4 : exprNames (ScopeB::CtxB) Msg NM ============================ exists CtxB', stmtNames (ScopeB::CtxB) (assert E Msg) N CtxB'
< search. Subgoal 2.12: Variables: NA CtxA' CtxB NB CtxB' X NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @ SNB : stmtNames CtxB (assert E Msg) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' E NE * SNA2 : exprNames CtxA' Msg NM * SNA3 : NE ++ NM = NA ============================ mems X CtxB'
< case IsS. Subgoal 2.12: Variables: NA CtxA' CtxB NB CtxB' X NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @ SNB : stmtNames CtxB (assert E Msg) NB CtxB' Mems : mems X CtxA' SNA1 : exprNames CtxA' E NE * SNA2 : exprNames CtxA' Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg ============================ mems X CtxB'
< SNB: case SNB. Subgoal 2.12: Variables: NA CtxA' NB CtxB' X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelAB : forall X1, mems X1 CtxA' -> mems X1 CtxB' SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @ Mems : mems X CtxA' SNA1 : exprNames CtxA' E NE * SNA2 : exprNames CtxA' Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames CtxB' E NE1 SNB1 : exprNames CtxB' Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ mems X CtxB'
< backchain RelAB. Subgoal 3.12: Variables: NA CtxA' CtxB NB CtxB' X NE NM Msg E IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB RelBA : forall X1, mems X1 CtxB -> mems X1 CtxA' SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @ SNB : stmtNames CtxB (assert E Msg) NB CtxB' Mems : mems X CtxB' SNA1 : exprNames CtxA' E NE * SNA2 : exprNames CtxA' Msg NM * SNA3 : NE ++ NM = NA ============================ mems X CtxA'
< SNB: case SNB. Subgoal 3.12: Variables: NA CtxA' NB CtxB' X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S N CtxA' ScopeB CtxB, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X, mems X (ScopeA::CtxA) -> mems X (ScopeB::CtxB)) -> (forall X, mems X (ScopeB::CtxB) -> mems X (ScopeA::CtxA)) -> stmtNames (ScopeA::CtxA) S N CtxA' * -> exists CtxB', stmtNames (ScopeB::CtxB) S N CtxB' IH_S_CAB : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_S_CBA : forall CtxA S NA CtxA' CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxB -> mems X1 CtxA) -> stmtNames CtxA S NA CtxA' * -> stmtNames CtxB S NB CtxB' -> mems X CtxB' -> mems X CtxA' IH_E : forall CtxA CtxB E N, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> exprNames CtxA E N * -> exprNames CtxB E N IH_A : forall CtxA CtxB A N, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> argsNames CtxA A N * -> argsNames CtxB A N IH_RF : forall CtxA CtxB RF N, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X, mems X CtxA -> mems X CtxB) -> (forall X, mems X CtxB -> mems X CtxA) -> recFieldNames CtxA RF N * -> recFieldNames CtxB RF N IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) CtxA' IsCtxB : is_list (is_list is_string) CtxB' RelBA : forall X1, mems X1 CtxB' -> mems X1 CtxA' SNA : stmtNames CtxA' (assert E Msg) NA CtxA' @ Mems : mems X CtxB' SNA1 : exprNames CtxA' E NE * SNA2 : exprNames CtxA' Msg NM * SNA3 : NE ++ NM = NA SNB : exprNames CtxB' E NE1 SNB1 : exprNames CtxB' Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ mems X CtxA'
< backchain RelBA. Proof completed.
< Prove exactEval:host:stmtNames_increaseCtxs, exactEval:host:stmtNames_increaseCtxs_ctxs, exactEval:host:exprNames_increaseCtxs. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NE NM Msg E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assert E Msg) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA ============================ mem X NA
< case IsS. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NE NM Msg E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assert E Msg) NB CtxB' M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg ============================ mem X NA
< SNB: case SNB. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB ============================ mem X NA
< Or: apply mem_append to M SNB2. Subgoal 1.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB Or : mem X NE1 \/ mem X NM1 ============================ mem X NA
< M': case Or. Subgoal 1.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB M' : mem X NE1 ============================ mem X NA
< ME: apply IH_E to _ _ _ _ SNA1 SNB M'. Subgoal 1.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB M' : mem X NE1 ME : mem X NE ============================ mem X NA
< apply mem_append_left to ME SNA3. Subgoal 1.12.1: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB M' : mem X NE1 ME : mem X NE H3 : mem X NA ============================ mem X NA
< search. Subgoal 1.12.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB M' : mem X NM1 ============================ mem X NA
< MM: apply IH_E to _ _ _ _ SNA2 SNB1 M'. Subgoal 1.12.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB M' : mem X NM1 MM : mem X NM ============================ mem X NA
< apply mem_append_right to MM SNA3. Subgoal 1.12.2: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mem X NB SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : is_expr E H2 : is_expr Msg SNB : exprNames (ScopeB::CtxB) E NE1 SNB1 : exprNames (ScopeB::CtxB) Msg NM1 SNB2 : NE1 ++ NM1 = NB M' : mem X NM1 MM : mem X NM H3 : mem X NA ============================ mem X NA
< search. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB CtxB' X NE NM Msg E IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ SNB : stmtNames (ScopeB::CtxB) (assert E Msg) NB CtxB' M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA ============================ mems X CtxB'
< case SNB. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : exprNames (ScopeB::CtxB) E NE1 H2 : exprNames (ScopeB::CtxB) Msg NM1 H3 : NE1 ++ NM1 = NB ============================ mems X (ScopeB::CtxB)
< apply RelAB to M. Subgoal 2.12: Variables: ScopeA CtxA NA ScopeB CtxB NB X NE NM Msg E NE1 NM1 IH_S : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mem X NB -> mem X NA IH_S_C : forall ScopeA CtxA S NA CtxA' ScopeB CtxB NB CtxB' X, is_stmt S -> is_list (is_list is_string) (ScopeA::CtxA) -> is_list (is_list is_string) (ScopeB::CtxB) -> (forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB)) -> stmtNames (ScopeA::CtxA) S NA CtxA' * -> stmtNames (ScopeB::CtxB) S NB CtxB' -> mems X CtxA' -> mems X CtxB' IH_E : forall CtxA E NA CtxB NB X, is_expr E -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> exprNames CtxA E NA * -> exprNames CtxB E NB -> mem X NB -> mem X NA IH_A : forall CtxA A NA CtxB NB X, is_args A -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> argsNames CtxA A NA * -> argsNames CtxB A NB -> mem X NB -> mem X NA IH_RF : forall CtxA RF NA CtxB NB X, is_recFieldExprs RF -> is_list (is_list is_string) CtxA -> is_list (is_list is_string) CtxB -> (forall X1, mems X1 CtxA -> mems X1 CtxB) -> recFieldNames CtxA RF NA * -> recFieldNames CtxB RF NB -> mem X NB -> mem X NA IsS : is_stmt (assert E Msg) IsCtxA : is_list (is_list is_string) (ScopeA::CtxA) IsCtxB : is_list (is_list is_string) (ScopeB::CtxB) RelAB : forall X1, mems X1 (ScopeA::CtxA) -> mems X1 (ScopeB::CtxB) SNA : stmtNames (ScopeA::CtxA) (assert E Msg) NA (ScopeA::CtxA) @ M : mems X (ScopeA::CtxA) SNA1 : exprNames (ScopeA::CtxA) E NE * SNA2 : exprNames (ScopeA::CtxA) Msg NM * SNA3 : NE ++ NM = NA H1 : exprNames (ScopeB::CtxB) E NE1 H2 : exprNames (ScopeB::CtxB) Msg NM1 H3 : NE1 ++ NM1 = NB H4 : mems X (ScopeB::CtxB) ============================ mems X (ScopeB::CtxB)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_exprNames. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsS : is_stmt (assert E Msg) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx' SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mem X N_P ============================ mem X N
< case IsS. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx' SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mem X N_P H1 : is_expr E H2 : is_expr Msg ============================ mem X N
< SN: case SN. Variables: Names Scope Ctx N N_P Ctx'_P X Msg E NE NM Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N ============================ mem X N
< SN_P: case SN_P. Variables: Names Scope Ctx N N_P X Msg E NE NM CN TN CtxT FN CtxF N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P1 : stmtNames ([]::(Scope::Ctx)) noop TN CtxT SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF SN_P3 : CN ++ TN = N2 SN_P4 : N2 ++ FN = N_P ============================ mem X N
< case SN_P1. Variables: Names Scope Ctx N N_P X Msg E NE NM CN FN CtxF N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF SN_P3 : CN ++ [] = N2 SN_P4 : N2 ++ FN = N_P ============================ mem X N
< SN_P: case SN_P2. Variables: Names Scope Ctx N N_P X Msg E NE NM CN FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P3 : CN ++ [] = N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) (errorExpr Msg intTy) FN ============================ mem X N
< SN_P: case SN_P1. Variables: Names Scope Ctx N N_P X Msg E NE NM CN FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P3 : CN ++ [] = N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN ============================ mem X N
< apply exprNames_unique to _ _ SN SN_P. Variables: Names Scope Ctx N N_P X Msg E NM CN FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E CN SN1 : exprNames (Scope::Ctx) Msg NM SN2 : CN ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P3 : CN ++ [] = N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN ============================ mem X N
< apply append_nil_right to SN_P3. Variables: Names Scope Ctx N N_P X Msg E NM FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P3 : N2 ++ [] = N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN ============================ mem X N
< clear SN_P3. Variables: Names Scope Ctx N N_P X Msg E NM FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN ============================ mem X N
< SN': apply exprNames_relatedCtxs to _ _ _ _ _ SN_P1 with CtxB = Scope::Ctx. Subgoal 1: Variables: Names Scope Ctx N N_P X Msg E NM FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN ============================ forall X, mems X ([]::(Scope::Ctx)) -> mems X (Scope::Ctx)
< intros M'. Subgoal 1: Variables: Names Scope Ctx N N_P X Msg E NM FN N2 X1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN M' : mems X1 ([]::(Scope::Ctx)) ============================ mems X1 (Scope::Ctx)
< M': case M'. Subgoal 1.1: Variables: Names Scope Ctx N N_P X Msg E NM FN N2 X1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN M' : mem X1 [] ============================ mems X1 (Scope::Ctx)
< case M'. Subgoal 1.2: Variables: Names Scope Ctx N N_P X Msg E NM FN N2 X1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN M' : mems X1 (Scope::Ctx) ============================ mems X1 (Scope::Ctx)
< search. Variables: Names Scope Ctx N N_P X Msg E NM FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg NM SN2 : N2 ++ NM = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN SN' : exprNames (Scope::Ctx) Msg FN ============================ mem X N
< apply exprNames_unique to _ _ SN1 SN'. Variables: Names Scope Ctx N N_P X Msg E FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg FN SN2 : N2 ++ FN = N SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN SN' : exprNames (Scope::Ctx) Msg FN ============================ mem X N
< apply append_unique to SN2 SN_P4. Variables: Names Scope Ctx N_P X Msg E FN N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mem X N_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E N2 SN1 : exprNames (Scope::Ctx) Msg FN SN2 : N2 ++ FN = N_P SN_P : exprNames (Scope::Ctx) E N2 SN_P4 : N2 ++ FN = N_P SN_P1 : exprNames ([]::(Scope::Ctx)) Msg FN SN' : exprNames (Scope::Ctx) Msg FN ============================ mem X N_P
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_forward. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsS : is_stmt (assert E Msg) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx' SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mems X Ctx' ============================ mems X Ctx'_P
< case IsS. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx' SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mems X Ctx' H1 : is_expr E H2 : is_expr Msg ============================ mems X Ctx'_P
< SN: case SN. Variables: Names Scope Ctx N N_P Ctx'_P X Msg E NE NM Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mems X (Scope::Ctx) H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N ============================ mems X Ctx'_P
< SN_P: case SN_P. Variables: Names Scope Ctx N N_P X Msg E NE NM CN TN CtxT FN CtxF N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P1 : stmtNames ([]::(Scope::Ctx)) noop TN CtxT SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF SN_P3 : CN ++ TN = N2 SN_P4 : N2 ++ FN = N_P ============================ mems X (Scope::Ctx)
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_stmtNames_names_backward. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsS : is_stmt (assert E Msg) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx' SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mems X Ctx'_P ============================ mems X Ctx'
< case IsS. Variables: Names Scope Ctx N Ctx' N_P Ctx'_P X Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN : stmtNames (Scope::Ctx) (assert E Msg) N Ctx' SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mems X Ctx'_P H1 : is_expr E H2 : is_expr Msg ============================ mems X Ctx'
< SN: case SN. Variables: Names Scope Ctx N N_P Ctx'_P X Msg E NE NM Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) SN_P : stmtNames (Scope::Ctx) (ifThenElse E noop (printVal (errorExpr Msg intTy))) N_P Ctx'_P M : mems X Ctx'_P H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N ============================ mems X (Scope::Ctx)
< SN_P: case SN_P. Variables: Names Scope Ctx N N_P X Msg E NE NM CN TN CtxT FN CtxF N2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) IsNames : is_list is_string Names IsCtx : is_list (is_list is_string) (Scope::Ctx) M : mems X (Scope::Ctx) H1 : is_expr E H2 : is_expr Msg SN : exprNames (Scope::Ctx) E NE SN1 : exprNames (Scope::Ctx) Msg NM SN2 : NE ++ NM = N SN_P : exprNames (Scope::Ctx) E CN SN_P1 : stmtNames ([]::(Scope::Ctx)) noop TN CtxT SN_P2 : stmtNames ([]::(Scope::Ctx)) (printVal (errorExpr Msg intTy)) FN CtxF SN_P3 : CN ++ TN = N2 SN_P4 : N2 ++ FN = N_P ============================ mems X (Scope::Ctx)
< search. Proof completed.
< Prove exactEval:host:typeOf_isTy, exactEval:host:stmtOK_isCtx. Subgoal 2.12: Variables: FT ET' Msg E IH : forall E FT ET Ty, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOf FT ET E Ty * -> is_typ Ty IH1 : forall S FT ET ET', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> is_list (is_list (is_pair is_string is_typ)) ET' IH2 : forall A FT ET Tys, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfArgs FT ET A Tys * -> is_list is_typ Tys IH3 : forall RF FT ET Fields, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> typeOfRecFields FT ET RF Fields * -> is_recFieldTys Fields IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (assert E Msg) ET' @ Ty1 : typeOf FT ET' E boolTy * Ty2 : typeOf FT ET' Msg stringTy * ============================ is_list (is_list (is_pair is_string is_typ)) ET'
< search. Proof completed.
< Prove exactEval:host:stmtOK_keep_scopes. Subgoal 12: Variables: FT ET' N Msg E IH : forall FT ET S ET' N, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> stmtOK FT ET S ET' * -> length ET N -> length ET' N IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' Ty : stmtOK FT ET' (assert E Msg) ET' @ L : length ET' N Ty1 : typeOf FT ET' E boolTy * Ty2 : typeOf FT ET' Msg stringTy * ============================ length ET' N
< search. Proof completed.
< Prove exactEval:host:stmtOK_older_scopes_same. Subgoal 12: Variables: FT ET Scope Msg E IH : forall FT ET S ET' Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S ET' * -> exists Scope', ET' = Scope'::ET IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope::ET) Ty : stmtOK FT (Scope::ET) (assert E Msg) (Scope::ET) @ Ty1 : typeOf FT (Scope::ET) E boolTy * Ty2 : typeOf FT (Scope::ET) Msg stringTy * ============================ exists Scope', Scope::ET = Scope'::ET
< search. Proof completed.
< Prove exactEval:host:stmtOK_first_scope_lookup_same. Subgoal 12: Variables: FT ET Scope' X Ty Msg E IH : forall FT ET S Scope Scope' X Ty, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) (Scope::ET) -> stmtOK FT (Scope::ET) S (Scope'::ET) * -> lookup Scope X Ty -> lookup Scope' X Ty IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) (Scope'::ET) Ty : stmtOK FT (Scope'::ET) (assert E Msg) (Scope'::ET) @ L : lookup Scope' X Ty Ty1 : typeOf FT (Scope'::ET) E boolTy * Ty2 : typeOf FT (Scope'::ET) Msg stringTy * ============================ lookup Scope' X Ty
< search. Proof completed.
< Prove exactEval:host:typeOf_unique, exactEval:host:stmtOK_unique. Subgoal 2.12: Variables: FT ET_B ET_A' ET_B' Msg E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B TyA : stmtOK FT ET_A' (assert E Msg) ET_A' @ TyB : stmtOK FT ET_B (assert E Msg) ET_B' Lkp : lookup_all_scopes ET_A' ET_B TyA1 : typeOf FT ET_A' E boolTy * TyA2 : typeOf FT ET_A' Msg stringTy * ============================ lookup_all_scopes ET_A' ET_B'
< case TyB. Subgoal 2.12: Variables: FT ET_A' ET_B' Msg E IH_E : forall FT ET_A ET_B E TyA TyB, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOf FT ET_A E TyA * -> typeOf FT ET_B E TyB -> lookup_all_scopes ET_A ET_B -> TyA = TyB IH_S : forall FT ET_A ET_B S ET_A' ET_B', is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> stmtOK FT ET_A S ET_A' * -> stmtOK FT ET_B S ET_B' -> lookup_all_scopes ET_A ET_B -> lookup_all_scopes ET_A' ET_B' IH_A : forall FT ET_A ET_B A TysA TysB, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfArgs FT ET_A A TysA * -> typeOfArgs FT ET_B A TysB -> lookup_all_scopes ET_A ET_B -> TysA = TysB IH_RF : forall FT ET_A ET_B RF FieldsA FieldsB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET_A -> is_list (is_list (is_pair is_string is_typ)) ET_B -> typeOfRecFields FT ET_A RF FieldsA * -> typeOfRecFields FT ET_B RF FieldsB -> lookup_all_scopes ET_A ET_B -> FieldsA = FieldsB IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsA : is_list (is_list (is_pair is_string is_typ)) ET_A' IsB : is_list (is_list (is_pair is_string is_typ)) ET_B' TyA : stmtOK FT ET_A' (assert E Msg) ET_A' @ Lkp : lookup_all_scopes ET_A' ET_B' TyA1 : typeOf FT ET_A' E boolTy * TyA2 : typeOf FT ET_A' Msg stringTy * H1 : typeOf FT ET_B' E boolTy H2 : typeOf FT ET_B' Msg stringTy ============================ lookup_all_scopes ET_A' ET_B'
< search. Proof completed.
< Prove exactEval:host:paramTy_is. Proof completed.
< Prove exactEval:host:getFunInfo_is. Proof completed.
< Prove exactEval:host:paramTy_exists. Proof completed.
< Prove exactEval:host:getFunInfo_exists. Proof completed.
< Prove exactEval:host:evalExpr_isCtx, exactEval:host:evalExpr_isValue, exactEval:host:evalStmt_isCtx, exactEval:host:evalArgs_isCtx, exactEval:host:evalArgs_isValue, exactEval:host:evalRecFields_isCtx, exactEval:host:evalRecFields_isValue. Subgoal 3.15: Variables: FE EE EE' O Msg E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * ============================ is_list (is_list (is_pair is_string is_value)) EE'
< case IsS. Subgoal 3.15: Variables: FE EE EE' O Msg E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg ============================ is_list (is_list (is_pair is_string is_value)) EE'
< apply IH_C_E to _ _ _ Ev1. Subgoal 3.15: Variables: FE EE EE' O Msg E IH_C_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_value V IH_C_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_C_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value V IH_C_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_list (is_pair is_string is_value)) EE' IH_V_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list (is_pair is_string is_value) V IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg H3 : is_list (is_list (is_pair is_string is_value)) EE' ============================ is_list (is_list (is_pair is_string is_value)) EE'
< search. Proof completed.
< Prove exactEval:host:evalExpr_isOutput, exactEval:host:evalStmt_isOutput, exactEval:host:evalArgs_isOutput, exactEval:host:evalRecFields_isOutput. Subgoal 2.15: Variables: FE EE EE' O Msg E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * ============================ is_list is_value O
< case IsS. Subgoal 2.15: Variables: FE EE EE' O Msg E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg ============================ is_list is_value O
< apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE EE' O Msg E IH_E : forall FE EE EE' E V O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> is_list is_value O IH_S : forall FE EE EE' S O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> is_list is_value O IH_A : forall FE EE EE' A V O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> is_list is_value O IH_RF : forall FE EE EE' RF V O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> is_list is_value O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg H3 : is_list is_value O ============================ is_list is_value O
< search. Proof completed.
< Prove exactEval:host:paramName_is. Proof completed.
< Prove exactEval:host:getFunEvalInfo_is. Proof completed.
< Prove exactEval:host:evalProgram_isOutput. Proof completed.
< Prove exactEval:host:evalExpr_names_same, exactEval:host:evalStmt_names_same, exactEval:host:evalArgs_names_same, exactEval:host:evalRecFields_names_same. Subgoal 2.15: Variables: FE Scope EE EE' O Msg E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assert E Msg) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O * ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case IsS. Subgoal 2.15: Variables: FE Scope EE EE' O Msg E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assert E Msg) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< NS: apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE Scope EE EE' O Msg E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assert E Msg) EE' O @ Ev1 : evalExpr FE (Scope::EE) E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg NS : names_same (Scope::EE) EE' ============================ exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE''
< case NS. Subgoal 2.15: Variables: FE Scope EE O Msg E BRest B IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> names_same EE EE' IH_S : forall S FE Scope EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE) -> evalStmt FE (Scope::EE) S EE' O * -> exists Scope' EE'', EE' = Scope'::EE'' /\ names_same EE EE'' IH_A : forall A FE EE V EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A V EE' O * -> names_same EE EE' IH_RF : forall RF FE EE V EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF V EE' O * -> names_same EE EE' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) (Scope::EE) Ev : evalStmt FE (Scope::EE) (assert E Msg) (B::BRest) O @ Ev1 : evalExpr FE (Scope::EE) E trueVal (B::BRest) O * H1 : is_expr E H2 : is_expr Msg H3 : forall X IA, mem (X, IA) Scope -> exists IB, mem (X, IB) B H4 : forall X IB, mem (X, IB) B -> exists IA, mem (X, IA) Scope H5 : names_same EE BRest ============================ exists Scope' EE'', B::BRest = Scope'::EE'' /\ names_same EE EE''
< search. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes, exactEval:host:evalExpr_newNameScopes_output, exactEval:host:evalExpr_newNameScopes_ctx, exactEval:host:evalStmt_newNameScopes_output, exactEval:host:evalStmt_newNameScopes, exactEval:host:evalArgs_newNameScopes, exactEval:host:evalArgs_newNameScopes_output, exactEval:host:evalArgs_newNameScopes_ctx, exactEval:host:evalRecFields_newNameScopes, exactEval:host:evalRecFields_newNameScopes_output, exactEval:host:evalRecFields_newNameScopes_ctx. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * ============================ O_A = O_B
< case IsS. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * H1 : is_expr E H2 : is_expr Msg ============================ O_A = O_B
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B ============================ O_A = O_B
< apply IH_O_E to _ _ _ _ EvA1 EvB _. Subgoal 4.15: Variables: FE EE_A EE_B EE_A' EE_B' O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_B @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_B * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B ============================ O_B = O_B
< search. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * ============================ newNameScopes N Len EE_A' EE_B'
< case IsS. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ EvB : evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O_B NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * H1 : is_expr E H2 : is_expr Msg ============================ newNameScopes N Len EE_A' EE_B'
< EvB: case EvB. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B ============================ newNameScopes N Len EE_A' EE_B'
< apply IH_C_E to _ _ _ _ EvA1 EvB _. Subgoal 5.15: Variables: FE EE_A EE_B EE_A' EE_B' O_A O_B N Len Scope Msg E IH_V_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_E : forall FE EE_A EE_B E VA VB EE_A' EE_B' O_A O_B N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalExpr FE EE_A E VA EE_A' O_A * -> evalExpr FE EE_B E VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_O_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_S : forall FE EE_A EE_B S EE_A' EE_B' O_A O_B N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> evalStmt FE (Scope::EE_A) S EE_A' O_A * -> evalStmt FE (Scope::EE_B) S EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_A : forall FE EE_A EE_B A VA VB EE_A' EE_B' O_A O_B N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalArgs FE EE_A A VA EE_A' O_A * -> evalArgs FE EE_B A VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IH_V_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> VA = VB IH_O_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> O_A = O_B IH_C_RF : forall FE EE_A EE_B RF VA VB EE_A' EE_B' O_A O_B N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> evalRecFields FE EE_A RF VA EE_A' O_A * -> evalRecFields FE EE_B RF VB EE_B' O_B -> newNameScopes N Len EE_A EE_B -> newNameScopes N Len EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O_A @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O_A * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE (Scope::EE_B) E trueVal EE_B' O_B H3 : newNameScopes N Len EE_A' EE_B' ============================ newNameScopes N Len EE_A' EE_B'
< search. Proof completed.
< Add_Ext_Size exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Proof completed.
< Add_Proj_Rel exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes_exists_ES, exactEval:host:evalStmt_newNameScopes_exists_ES, exactEval:host:evalArgs_newNameScopes_exists_ES, exactEval:host:evalRecFields_newNameScopes_exists_ES. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 * ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 * H1 : is_expr E H2 : is_expr Msg ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
< apply ext_size_is_int_evalExpr to EvB2. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 * H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
< apply IH_E to _ _ _ _ EvB2 _. Subgoal 2.15: Variables: FE EE_A EE_B EE_B' O N Len Scope ES N2 Msg E EE_A' IH_E : forall FE EE_A EE_B E V EE_B' O N Len ES, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalExpr {ES}> FE EE_B E V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalExpr {ES}> FE EE_A E V EE_A' O ES IH_S : forall FE EE_A EE_B S EE_B' O N Len Scope ES, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> <evalStmt {ES}> FE (Scope::EE_B) S EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) S EE_A' O ES IH_A : forall FE EE_A EE_B A V EE_B' O N Len ES, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalArgs {ES}> FE EE_B A V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalArgs {ES}> FE EE_A A V EE_A' O ES IH_RF : forall FE EE_A EE_B RF V EE_B' O N Len ES, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> <evalRecFields {ES}> FE EE_B RF V EE_B' O ES * -> newNameScopes N Len EE_A EE_B -> exists EE_A', <evalRecFields {ES}> FE EE_A RF V EE_A' O ES IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) EvB : <evalStmt {ES}> FE (Scope::EE_B) (assert E Msg) EE_B' O ES @ NNS : newNameScopes N Len EE_A EE_B EvB1 : 1 + N2 = ES EvB2 : <evalExpr {ES}> FE (Scope::EE_B) E trueVal EE_B' O N2 * H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 H4 : <evalExpr {ES}> FE (Scope::EE_A) E trueVal EE_A' O N2 ============================ exists EE_A', <evalStmt {ES}> FE (Scope::EE_A) (assert E Msg) EE_A' O ES
< search. Proof completed.
< Prove exactEval:host:evalExpr_ctx_names, exactEval:host:evalStmt_ctx_names, exactEval:host:evalArgs_ctx_names, exactEval:host:evalRecFields_ctx_names. Subgoal 2.15: Variables: FE EE EE' O Ctx Ctx' N Msg E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) N Ctx' Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * ============================ ctx_names EE' Ctx'
< case IsS. Subgoal 2.15: Variables: FE EE EE' O Ctx Ctx' N Msg E IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) N Ctx' Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg ============================ ctx_names EE' Ctx'
< SN: case SN. Subgoal 2.15: Variables: FE EE EE' O Ctx' N Msg E NE NM IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg SN : exprNames Ctx' E NE SN1 : exprNames Ctx' Msg NM SN2 : NE ++ NM = N ============================ ctx_names EE' Ctx'
< apply IH_E to _ _ _ _ Ctxs SN Ev1. Subgoal 2.15: Variables: FE EE EE' O Ctx' N Msg E NE NM IH_E : forall FE EE E V EE' O Ctx N, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> exprNames Ctx E N -> evalExpr FE EE E V EE' O * -> ctx_names EE' Ctx IH_S : forall FE EE S EE' O Ctx Ctx' N, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> stmtNames Ctx S N Ctx' -> evalStmt FE EE S EE' O * -> ctx_names EE' Ctx' IH_A : forall FE EE A V EE' O Ctx N, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> argsNames Ctx A N -> evalArgs FE EE A V EE' O * -> ctx_names EE' Ctx IH_RF : forall FE EE RF V EE' O Ctx N, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_list (is_list is_string) Ctx -> ctx_names EE Ctx -> recFieldNames Ctx RF N -> evalRecFields FE EE RF V EE' O * -> ctx_names EE' Ctx IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names EE Ctx' Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg SN : exprNames Ctx' E NE SN1 : exprNames Ctx' Msg NM SN2 : NE ++ NM = N H3 : ctx_names EE' Ctx' ============================ ctx_names EE' Ctx'
< search. Proof completed.
< Prove exactEval:host:evalExpr_newNameScopes_exists_back, exactEval:host:evalStmt_newNameScopes_exists_back, exactEval:host:evalArgs_newNameScopes_exists_back, exactEval:host:evalRecFields_newNameScopes_exists_back. Subgoal 2.15: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Msg E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O * ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_B Ctx Ctx' EE_A' O N Len Scope Msg E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names (Scope::EE_B) Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O * H1 : is_expr E H2 : is_expr Msg ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
< SN: case SN. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Msg E NE NM IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O * H1 : is_expr E H2 : is_expr Msg SN : exprNames Ctx' E NE SN1 : exprNames Ctx' Msg NM SN2 : NE ++ NM = [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
< case SN2. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Msg E IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O * H1 : is_expr E H2 : is_expr Msg SN : exprNames Ctx' E [] SN1 : exprNames Ctx' Msg [] ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
< apply IH_E to _ _ _ _ _ Ctxs SN EvA1 _. Subgoal 2.15: Variables: FE EE_A EE_B Ctx' EE_A' O N Len Scope Msg E EE_B' IH_E : forall FE EE_A EE_B E V Ctx EE_A' O N Len, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> exprNames Ctx E [] -> evalExpr FE EE_A E V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall FE EE_A EE_B S Ctx Ctx' EE_A' O N Len Scope, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) -> is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) -> is_list (is_list is_string) Ctx -> ctx_names (Scope::EE_B) Ctx -> stmtNames Ctx S [] Ctx' -> evalStmt FE (Scope::EE_A) S EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalStmt FE (Scope::EE_B) S EE_B' O IH_A : forall FE EE_A EE_B A V Ctx EE_A' O N Len, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> argsNames Ctx A [] -> evalArgs FE EE_A A V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall FE EE_A EE_B RF V Ctx EE_A' O N Len, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> is_list (is_list is_string) Ctx -> ctx_names EE_B Ctx -> recFieldNames Ctx RF [] -> evalRecFields FE EE_A RF V EE_A' O * -> newNameScopes N Len EE_A EE_B -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) (Scope::EE_A) IsB : is_list (is_list (is_pair is_string is_value)) (Scope::EE_B) IsCtx : is_list (is_list is_string) Ctx' Ctxs : ctx_names (Scope::EE_B) Ctx' EvA : evalStmt FE (Scope::EE_A) (assert E Msg) EE_A' O @ NNS : newNameScopes N Len EE_A EE_B EvA1 : evalExpr FE (Scope::EE_A) E trueVal EE_A' O * H1 : is_expr E H2 : is_expr Msg SN : exprNames Ctx' E [] SN1 : exprNames Ctx' Msg [] H3 : evalExpr FE (Scope::EE_B) E trueVal EE_B' O ============================ exists EE_B', evalStmt FE (Scope::EE_B) (assert E Msg) EE_B' O
< search. Proof completed.
< Prove exactEval:host:evalExpr_scopes_same, exactEval:host:evalExpr_scopes_same_ctx, exactEval:host:evalStmt_scopes_same, exactEval:host:evalStmt_scopes_same_ctx, exactEval:host:evalArgs_scopes_same, exactEval:host:evalArgs_scopes_same_ctx, exactEval:host:evalRecFields_scopes_same, exactEval:host:evalRecFields_scopes_same_ctx. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * ============================ OA = OB
< case IsS. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * H1 : is_expr E H2 : is_expr Msg ============================ OA = OB
< EvB: case EvB. Subgoal 3.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE EE_B E trueVal EE_B' OB ============================ OA = OB
< apply IH_E to _ _ _ _ SS EvA1 EvB. Subgoal 3.15: Variables: FE EE_A EE_A' EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OB @ EvA1 : evalExpr FE EE_A E trueVal EE_A' OB * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE EE_B E trueVal EE_B' OB ============================ OB = OB
< search. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * ============================ scopes_same EE_A' EE_B'
< case IsS. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvB : evalStmt FE EE_B (assert E Msg) EE_B' OB EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * H1 : is_expr E H2 : is_expr Msg ============================ scopes_same EE_A' EE_B'
< EvB: case EvB. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE EE_B E trueVal EE_B' OB ============================ scopes_same EE_A' EE_B'
< apply IH_E_C to _ _ _ _ _ EvA1 EvB. Subgoal 4.15: Variables: FE EE_A EE_A' OA EE_B EE_B' OB Msg E IH_E : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> VA = VB /\ OA = OB IH_E_C : forall E FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E VA EE_A' OA * -> evalExpr FE EE_B E VB EE_B' OB -> scopes_same EE_A' EE_B' IH_S : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> OA = OB IH_S_C : forall S FE EE_A EE_A' OA EE_B EE_B' OB, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' OA * -> evalStmt FE EE_B S EE_B' OB -> scopes_same EE_A' EE_B' IH_A : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> VA = VB /\ OA = OB IH_A_C : forall A FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A VA EE_A' OA * -> evalArgs FE EE_B A VB EE_B' OB -> scopes_same EE_A' EE_B' IH_RF : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> VA = VB /\ OA = OB IH_RF_C : forall RF FE EE_A VA EE_A' OA EE_B VB EE_B' OB, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF VA EE_A' OA * -> evalRecFields FE EE_B RF VB EE_B' OB -> scopes_same EE_A' EE_B' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' OA @ EvA1 : evalExpr FE EE_A E trueVal EE_A' OA * H1 : is_expr E H2 : is_expr Msg EvB : evalExpr FE EE_B E trueVal EE_B' OB H3 : scopes_same EE_A' EE_B' ============================ scopes_same EE_A' EE_B'
< search. Proof completed.
< Prove exactEval:host:evalExpr_scopes_same_exists, exactEval:host:evalStmt_scopes_same_exists, exactEval:host:evalArgs_scopes_same_exists, exactEval:host:evalRecFields_scopes_same_exists. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B Msg E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' O @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O * ============================ exists EE_B', evalStmt FE EE_B (assert E Msg) EE_B' O
< case IsS. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B Msg E IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' O @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O * H1 : is_expr E H2 : is_expr Msg ============================ exists EE_B', evalStmt FE EE_B (assert E Msg) EE_B' O
< apply IH_E to _ _ _ _ SS EvA1. Subgoal 2.15: Variables: FE EE_A EE_A' O EE_B Msg E EE_B' IH_E : forall E FE EE_A V EE_A' O EE_B, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalExpr FE EE_A E V EE_A' O * -> exists EE_B', evalExpr FE EE_B E V EE_B' O IH_S : forall S FE EE_A EE_A' O EE_B, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalStmt FE EE_A S EE_A' O * -> exists EE_B', evalStmt FE EE_B S EE_B' O IH_A : forall A FE EE_A V EE_A' O EE_B, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalArgs FE EE_A A V EE_A' O * -> exists EE_B', evalArgs FE EE_B A V EE_B' O IH_RF : forall RF FE EE_A V EE_A' O EE_B, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE_A -> is_list (is_list (is_pair is_string is_value)) EE_B -> scopes_same EE_A EE_B -> evalRecFields FE EE_A RF V EE_A' O * -> exists EE_B', evalRecFields FE EE_B RF V EE_B' O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsA : is_list (is_list (is_pair is_string is_value)) EE_A IsB : is_list (is_list (is_pair is_string is_value)) EE_B SS : scopes_same EE_A EE_B EvA : evalStmt FE EE_A (assert E Msg) EE_A' O @ EvA1 : evalExpr FE EE_A E trueVal EE_A' O * H1 : is_expr E H2 : is_expr Msg H3 : evalExpr FE EE_B E trueVal EE_B' O ============================ exists EE_B', evalStmt FE EE_B (assert E Msg) EE_B' O
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalExpr_backward. Proof completed.
< Theorem is_list_values_append_nil : forall L, is_list is_value L -> L ++ [] = L. ============================ forall L, is_list is_value L -> L ++ [] = L
< induction on 1. IH : forall L, is_list is_value L * -> L ++ [] = L ============================ forall L, is_list is_value L @ -> L ++ [] = L
< intros IsL. Variables: L IH : forall L, is_list is_value L * -> L ++ [] = L IsL : is_list is_value L @ ============================ L ++ [] = L
< Is: case IsL. Subgoal 1: IH : forall L, is_list is_value L * -> L ++ [] = L ============================ [] ++ [] = []
< search. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> L ++ [] = L Is : is_value H Is1 : is_list is_value T * ============================ H::T ++ [] = H::T
< apply IH to Is1. Subgoal 2: Variables: T H IH : forall L, is_list is_value L * -> L ++ [] = L Is : is_value H Is1 : is_list is_value T * H1 : T ++ [] = T ============================ H::T ++ [] = H::T
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_forward. Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O ============================ exists EE'', evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\ scopes_same EE' EE''
< case IsS. Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O H1 : is_expr E H2 : is_expr Msg ============================ exists EE'', evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O ============================ exists EE'', evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ exists EE'', evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE'' O /\ scopes_same EE' EE''
< exists EE'. Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O /\ scopes_same EE' EE'
< split. Subgoal 1: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O
< unfold . Subgoal 1: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ exists EE1 O1 Scope O2, evalExpr FE EE E trueVal EE1 O1 /\ (evalStmt FE ([]::EE1) noop (Scope::EE') O2 /\ O1 ++ O2 = O)
< exists EE', O, [], []. Subgoal 1: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ evalExpr FE EE E trueVal EE' O /\ (evalStmt FE ([]::EE') noop ([]::EE') [] /\ O ++ [] = O)
< split. Subgoal 1.1: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ evalExpr FE EE E trueVal EE' O
< search. Subgoal 1.2: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ evalStmt FE ([]::EE') noop ([]::EE') []
< search. Subgoal 1.3: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ O ++ [] = O
< IsO: apply evalExpr_isOutput to _ _ _ Ev. Subgoal 1.3: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' IsO : is_list is_value O ============================ O ++ [] = O
< backchain is_list_values_append_nil. Subgoal 2: Variables: Names FE EE EE' O Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ scopes_same EE' EE'
< search. Proof completed.
< Prove_Constraint exactEval:host:proj_evalStmt_backward. Variables: Names FE EE EE' O Ctx Ctx' Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' Ev : evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< case IsS. Variables: Names FE EE EE' O Ctx Ctx' Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' Ev : evalStmt FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O H1 : is_expr E H2 : is_expr Msg ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< Ev: case Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE3 O2 Ev1 : evalStmt FE ([]::EE3) noop (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< case Ev1. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Msg E O2 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O2 Ev2 : O2 ++ [] = O ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< apply append_nil_right to Ev2. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O Ev2 : O ++ [] = O ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< IsEE': apply evalExpr_isCtx to _ _ _ Ev. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O Ev2 : O ++ [] = O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< apply scopes_same_reflexive to IsEE'. Subgoal 1: Variables: Names FE EE EE' O Ctx Ctx' Msg E Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E trueVal EE' O Ev2 : O ++ [] = O IsEE' : is_list (is_list (is_pair is_string is_value)) EE' H3 : scopes_same EE' EE' ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< search. Subgoal 2: Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E falseVal EE3 O2 Ev1 : evalStmt FE ([]::EE3) (printVal (errorExpr Msg intTy)) (Scope::EE') O3 Ev2 : O2 ++ O3 = O ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< Ev': case Ev1. Subgoal 2.1: Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 I O1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E falseVal EE3 O2 Ev2 : O2 ++ O3 = O Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) (intVal I) (Scope::EE') O1 Ev'1 : O1 ++ [intVal I] = O3 ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< case Ev'. Subgoal 2.2: Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 O1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E falseVal EE3 O2 Ev2 : O2 ++ O3 = O Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) trueVal (Scope::EE') O1 Ev'1 : O1 ++ [trueVal] = O3 ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< case Ev'. Subgoal 2.3: Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 O1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E falseVal EE3 O2 Ev2 : O2 ++ O3 = O Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) falseVal (Scope::EE') O1 Ev'1 : O1 ++ [falseVal] = O3 ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< case Ev'. Subgoal 2.4: Variables: Names FE EE EE' O Ctx Ctx' Msg E EE3 O2 Scope O3 S1 O1 Pr : Names |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) Names : names EE Names IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsCtx : is_list (is_list is_string) Ctx Ctxs : ctx_names EE Ctx SN : stmtNames Ctx (assert E Msg) [] Ctx' H1 : is_expr E H2 : is_expr Msg Ev : evalExpr FE EE E falseVal EE3 O2 Ev2 : O2 ++ O3 = O Ev' : evalExpr FE ([]::EE3) (errorExpr Msg intTy) (stringVal S1) (Scope::EE') O1 Ev'1 : O1 ++ [stringVal S1] = O3 ============================ exists EE'', evalStmt FE EE (assert E Msg) EE'' O /\ scopes_same EE' EE''
< case Ev'. Proof completed.
< Prove_Ext_Ind exactEval:host:evalExpr, exactEval:host:evalArgs, exactEval:host:evalRecFields, exactEval:host:evalStmt. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE IsS : is_stmt (assert E Msg) R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< case IsS. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< apply ext_size_is_int_evalExpr to R2. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ Acc : acc N @ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< Acc: case Acc. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< L: apply lt_plus_one to R1 _. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< apply ext_size_pos_evalExpr to R2. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< A: apply Acc to _ L. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< apply IH to R2 A _ _ _. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< Names: apply names_exists to IsEE. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalStmt {P}> FE EE (assert E Msg) EE' O
< unfold . Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ exists Names S_P EE_P O_P, <evalExpr {P}> FE EE E trueVal EE' O /\ (names EE Names /\ (Names |{stmt}- assert E Msg ~~> S_P /\ <evalStmt {P}> FE EE S_P EE_P O_P))
< exists N1, ifThenElse E noop (printVal (errorExpr Msg intTy)), EE', O. Subgoal 4.15: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalExpr {P}> FE EE E trueVal EE' O /\ (names EE N1 /\ (N1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy)) /\ <evalStmt {P}> FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O))
< split. Subgoal 4.15.1: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalExpr {P}> FE EE E trueVal EE' O
< search. Subgoal 4.15.2: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ names EE N1
< search. Subgoal 4.15.3: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ N1 |{stmt}- assert E Msg ~~> ifThenElse E noop (printVal (errorExpr Msg intTy))
< search. Subgoal 4.15.4: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalStmt {P}> FE EE (ifThenElse E noop (printVal (errorExpr Msg intTy))) EE' O
< unfold . Subgoal 4.15.4: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ exists EE1 O1 Scope O2, <evalExpr {P}> FE EE E trueVal EE1 O1 /\ (<evalStmt {P}> FE ([]::EE1) noop (Scope::EE') O2 /\ O1 ++ O2 = O)
< exists EE', O, [], []. Subgoal 4.15.4: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalExpr {P}> FE EE E trueVal EE' O /\ (<evalStmt {P}> FE ([]::EE') noop ([]::EE') [] /\ O ++ [] = O)
< split. Subgoal 4.15.4.1: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalExpr {P}> FE EE E trueVal EE' O
< search. Subgoal 4.15.4.2: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ <evalStmt {P}> FE ([]::EE') noop ([]::EE') []
< search. Subgoal 4.15.4.3: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 ============================ O ++ [] = O
< Ev: apply drop_ext_size_evalExpr to R2. Subgoal 4.15.4.3: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 Ev : evalExpr FE EE E trueVal EE' O ============================ O ++ [] = O
< apply evalExpr_isOutput to _ _ _ Ev. Subgoal 4.15.4.3: Variables: N FE EE EE' O N2 Msg E N1 IH : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH1 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH2 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH3 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N -> acc N * -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O IH4 : forall N FE EE E V EE' O, <evalExpr {ES}> FE EE E V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_expr E -> <evalExpr {P}> FE EE E V EE' O IH5 : forall N FE EE A V EE' O, <evalArgs {ES}> FE EE A V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_args A -> <evalArgs {P}> FE EE A V EE' O IH6 : forall N FE EE RF V EE' O, <evalRecFields {ES}> FE EE RF V EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_recFieldExprs RF -> <evalRecFields {P}> FE EE RF V EE' O IH7 : forall N FE EE S EE' O, <evalStmt {ES}> FE EE S EE' O N ** -> acc N @ -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> is_stmt S -> <evalStmt {P}> FE EE S EE' O R : <evalStmt {ES}> FE EE (assert E Msg) EE' O N @@ IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE R1 : 1 + N2 = N R2 : <evalExpr {ES}> FE EE E trueVal EE' O N2 ** H1 : is_expr E H2 : is_expr Msg H3 : is_integer N2 Acc : forall M, 0 <= M -> M < N -> acc M * L : N2 < N H4 : 0 <= N2 A : acc N2 * H5 : <evalExpr {P}> FE EE E trueVal EE' O Names : names EE N1 Ev : evalExpr FE EE E trueVal EE' O H6 : is_list is_value O ============================ O ++ [] = O
< backchain is_list_values_append_nil. Proof completed.
< Prove exactEval:host:paramName_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_paramName_back. Proof completed.
< Prove exactEval:host:getFunEvalInfo_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_getFunEvalInfo_back. Proof completed.
< Prove exactEval:host:evalProgram_unique. Proof completed.
< Prove_Constraint exactEval:host:proj_evalProgram_forward. Proof completed.
< Prove_Constraint exactEval:host:proj_evalProgram_back. Proof completed.
< Prove exactEval:host:evalExpr_typePres_ctx, exactEval:host:evalExpr_typePres, exactEval:host:evalStmt_typePres, exactEval:host:evalArgs_typePres_Ctx, exactEval:host:evalArgs_typePres, exactEval:host:evalRecFields_typePres_Ctx, exactEval:host:evalRecFields_typePres. Subgoal 3.15: Variables: FT ET ET' FE EE EE' O Msg E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsS : is_stmt (assert E Msg) IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (assert E Msg) ET' Ev : evalStmt FE EE (assert E Msg) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E trueVal EE' O * ============================ related_all_scopes ET' EE'
< case IsS. Subgoal 3.15: Variables: FT ET ET' FE EE EE' O Msg E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ty : stmtOK FT ET (assert E Msg) ET' Ev : evalStmt FE EE (assert E Msg) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET EE Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg ============================ related_all_scopes ET' EE'
< Ty: case Ty. Subgoal 3.15: Variables: FT ET' FE EE EE' O Msg E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg Ty : typeOf FT ET' E boolTy Ty1 : typeOf FT ET' Msg stringTy ============================ related_all_scopes ET' EE'
< apply IH_C_E to _ _ _ _ _ Ty Ev1 _ _. Subgoal 3.15: Variables: FT ET' FE EE EE' O Msg E IH_C_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_E : forall E FT ET Ty FE EE EE' O V, is_expr E -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOf FT ET E Ty -> evalExpr FE EE E V EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueType V Ty IH_C_S : forall S FT ET ET' FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> stmtOK FT ET S ET' -> evalStmt FE EE S EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET' EE' IH_C_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_A : forall A FT ET Tys FE EE EE' O Vs, is_args A -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfArgs FT ET A Tys -> evalArgs FE EE A Vs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valueTypeList Vs Tys IH_C_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> related_all_scopes ET EE' IH_T_RF : forall RF FT ET FTys FE EE EE' O FVs, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT -> is_list (is_list (is_pair is_string is_typ)) ET -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> typeOfRecFields FT ET RF FTys -> evalRecFields FE EE RF FVs EE' O * -> (forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv') -> related_all_scopes ET EE -> valFieldTys FVs FTys IsFT : is_list (is_pair is_string (is_pair is_typ (is_list is_typ))) FT IsET : is_list (is_list (is_pair is_string is_typ)) ET' IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Funs : forall F RetTy ArgTys ArgNames Body RetVar RVVal, lookup FT F (RetTy, ArgTys) -> lookup FE F (RetVar, (RVVal, (ArgNames, Body))) -> exists Scope TyEnv', (zip ArgNames ArgTys Scope /\ valueType RVVal RetTy) /\ stmtOK FT [(RetVar, RetTy)::Scope] Body TyEnv' Ctxs : related_all_scopes ET' EE Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg Ty : typeOf FT ET' E boolTy Ty1 : typeOf FT ET' Msg stringTy H3 : related_all_scopes ET' EE' ============================ related_all_scopes ET' EE'
< search. Proof completed.
< Prove exactEval:host:paramTy_paramName_same. Proof completed.
< Prove exactEval:host:funOK_getFunEvalInfo_related. Proof completed.
< Prove exactEval:host:evalExpr_output_forms, exactEval:host:evalStmt_output_forms, exactEval:host:evalArgs_output_forms, exactEval:host:evalRecFields_output_forms. Subgoal 2.15: Variables: FE EE EE' O Msg E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsS : is_stmt (assert E Msg) IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * ============================ output_forms O
< case IsS. Subgoal 2.15: Variables: FE EE EE' O Msg E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg ============================ output_forms O
< apply IH_E to _ _ _ Ev1. Subgoal 2.15: Variables: FE EE EE' O Msg E IH_E : forall E FE EE V EE' O, is_expr E -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalExpr FE EE E V EE' O * -> output_forms O IH_S : forall S FE EE EE' O, is_stmt S -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalStmt FE EE S EE' O * -> output_forms O IH_A : forall A FE EE Vs EE' O, is_args A -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalArgs FE EE A Vs EE' O * -> output_forms O IH_RF : forall RF FE EE Fields EE' O, is_recFieldExprs RF -> is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE -> is_list (is_list (is_pair is_string is_value)) EE -> evalRecFields FE EE RF Fields EE' O * -> output_forms O IsFE : is_list (is_pair is_string (is_pair is_string (is_pair is_value (is_pair (is_list is_string) is_stmt)))) FE IsEE : is_list (is_list (is_pair is_string is_value)) EE Ev : evalStmt FE EE (assert E Msg) EE' O @ Ev1 : evalExpr FE EE E trueVal EE' O * H1 : is_expr E H2 : is_expr Msg H3 : output_forms O ============================ output_forms O
< search. Proof completed.
< Prove exactEval:host:evalProgram_output_forms. Proof completed.
< Prove exactEval:host:paramName_exists. Proof completed.
< Prove exactEval:host:getFunEvalInfo_exists. Proof completed.